bash編程(三)之循環

                      bash編程(三)之循環編程

bash三種循環:for循環,while循環,until循環。這些循環熟練掌握一種循環便可。數組

知識點:bash

1、信號捕捉:trap 'command;command' ide

        2、循環控制:函數

           continue:提早進入下一輪循環測試

             一般用於條件語句中,僅在某些特殊場景下ui

           break [n]:跳出當前[n]層循環spa

             一般用於條件語句中,僅在某些特殊場景下排序

             echo true ip

              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

 

2、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

 

3、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的擴展知識了。要知數組是怎麼樣,請看下一篇。

相關文章
相關標籤/搜索