bash编程(三)之循环

bash三种循环:for循环,while循环,until循环。这些循环熟练掌握一种循环即可。

知识点:

1、信号捕捉:trap 'command;command'

        2、循环控制:

           continue:提前进入下一轮循环

             通常用于条件语句中,仅在某些特殊场景下

           break [n]:跳出当前[n]层循环

             通常用于条件语句中,仅在某些特殊场景下

             echo true

              echo $RANDOM 生成随机数

  • 循环:

   事先提供一个元素列表,而后,使用变量去遍历此元素列表,每访问一个元素,就执行一次循环体,直到元素列表访问完毕。

for:遍历有限的元素列表

    语法格式:

           for VAR_NAME in LIST

           do

                循环体

           done

             

          注: LIST列表:中间包括一个或多个元素

生成列表的方式:

                            1、手动给个列表:

                                     fori in 1 2 3 4 5;

                            2、数值列表:

                                     {start..end}

                                例如:{1..100}

                            3$*, $@

                            4、命令生成列表   {start..end}

                 `seq [start [increment]] end`

                 `seq 4 3 10` 命令引用(从4开始步进为310,结果为:4710

 

二、until格式

       until 测试条件;do

           循环体

       done

       测试条件为假,进入循环。测试条件为真,退出循环。

       测试条件一般通过变量来描述,需要在循环体不断地改变变量的值,以确保某一时刻测试条件为真,进而结束循环;

   注:赋值不加$,比较要加

例:写一个脚本,完成如下功能(使用函数)

1、提示用户输入一个可执行命令;

2、获取这个命令所依赖的所有库文件(使用ldd命令)

3、复制命令至/mnt/sysroot/对应的目录中

         解释:假设,如果复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,如果复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;

4、复制各库文件至/mnt/sysroot/对应的目录中;

#!/bin/bash

#

target=/mnt/sysroot/

 

[ -d $target ] || mkdir $target

 

preCommand() {

   if which $1 &> /dev/null; then

         commandPath=`which--skip-alias $1`

         return0

   else

         echo"No such command."

         return1

   fi

}

 

commandCopy() {

   commandDir=`dirname $1`

    [-d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}

    [-f ${target}${commandPath} ] || cp $1 ${target}${commandDir}

}

 

libCopy() {

   for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do

         libDir=`dirname$lib`

         [-d ${target}${libDir} ] || mkdir -p ${target}${libDir}

         [-f ${target}${lib} ] || cp $lib ${target}${libDir}

   done

}

 

read -p "Plz enter a command: "command

 

until [ "$command" == 'quit' ];do

 

  ifpreCommand $command &> /dev/null; then

   commandCopy $commandPath

   libCopy $commandPath

  fi

 

 read -p "Plz enter a command: " command

done

 

三、while循环:测试条件为真,进入循环。测试条件为假,退出循环。测试条件一般通过变量来描述,需要在循环体不断地改变变量的值,以确保某一时刻测试条件为假,进而结束循环。 

     1while 测试条件;do

           循环体

       done 

    2while循环:遍历文本文件

    语法格式:

       whileread 变量名;do

          循环体

       done </path/to/somefile

      变量名,每循环一次,记忆文件中的一行

例题1:遍历文本文件

显示其ID号为偶数的用户的用户名、ID号和SHELL

#!/bin/bash

#

 

while read line; do

   userID=`echo $line | cut -d: -f3`

   if [ $[$userID%2] -eq 0 ];then

       echo $line | cut -d: -f1,3,7

   fi

done < /etc/passwd

 

例体2:显示ID号为偶数,且ID号同GID的用户的用户名、IDSHELL

while read line; do

         userID=`echo$line | cut -d: -f3`

         groupID=`echo$line | cut -d: -f4`

         if[ $[$userID%2] -eq 0 -a $userID -eq $groupID ]; then

                 echo $line | cut -d: -f1,3,7

  fi

done < /etc/passwd

     

例题3:复制一个数组中下标为偶数的元素至一个新数组中

#!/bin/bash

declare -a mylogs

logs=(/var/log/*.log)

 

echo ${logs[@]}

 

for i in `seq 0 ${#logs[@]}`; do

   if [ $[$i%2] -eq 0 ];then

      index=${#mylogs[@]}

      mylogs[$index]=${logs[$i]}

   fi

done

 

echo ${mylogs[@]}

 

例题4:生成10个随机数,升序排序

 

#!/bin/bash

#

 

declare -a arr

for i in {0..9};do

   arr[$i]=$RANDOM

done

tmp=0

for i in {0..8};do

   for j in `seq $i 9`;do

       if [ ${arr[$i]} -gt ${arr[$j]} ];then

           tmp=${arr[$i]}

           arr[$i]=${arr[$j]}

           arr[$j]=$tmp

       fi

   done

done

 

echo ${arr[@]}

 

例题5:打印九九乘法表

 

#!/bin/bash

#

for x in {1..9};do

       for y in `seq 1 $x`;do

                echo -ne"$x*$y=$[$x*$y]\t"

       done

       echo

done        

 

呵呵,bash编程主体已经写完,大家也看出来了,下面一篇应该就是数组和bash的扩展知识了。要知数组是怎么样,请看下一篇。