1. 程式人生 > >bash腳本編程之for循環及應用

bash腳本編程之for循環及應用

bash腳本編程

循環執行結構:

循環結構包括兩個環節;

1.進入循環的條件:

在符合要求或滿足條件時才開始循環;

2.退出循環的條件:

達到某個要求或符合某個條件時需要結束或終止循環的執行;


for循環:

1.遍歷列表的循環:

為列表中的每個成員執行命令。

for 名稱 [in 詞語 ... ] ; do 命令; done


建議在腳本中的書寫格式:

for VAR_NAME in LIST ; do

循環體

done

for VAR_NAME in LIST

do

循環體

done


註意:

VAR_NAME:任意指定的變量名稱,變量的值是從LIST中遍歷獲取的各個元素;

LIST:for循環需要變量的列表;可以通過以下方式生成列表:

1.直接給出列表;

2.純整數列表;

1)花括號展開:

[root@localhost ~]# echo {1..10}

1 2 3 4 5 6 7 8 9 10

{FIRST,SECOND,THIRD,...,LAST}

[root@localhost ~]# echo {1,2,3,4,5}

1 2 3 4 5


2)seq命令

seq [OPTION]... LAST :給出一個數字,默認從1到指定數字,默認是遞增順序;

[root@localhost ~]# seq 5

1

2

3

4

5

seq [OPTION]... FIRST LAST :給出開始的數字,之後遞增到指定的數字,默認遞增;

[root@localhost ~]# seq 2 5

2

3

4

5

seq [OPTION]... FIRST INCREMENT LAST :給出開始的數字,中間是遞增(可正可負)間隔

[root@localhost ~]# seq 2 2 10

2

4

6

8

10

[root@localhost ~]# seq 10 -2 2

10

8

6

4

2


3)花括號展開:

{FIRST...LAST}(字母也可以)

[root@localhost ~]# echo {a..z}

a b c d e f g h i j k l m n o p q r s t u v w x y z

[root@localhost ~]# echo {A..Z}

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

4)命令的執行結果:

ls /etc

grep /PATH/TO/SOMEFILE

5) GLOBBING(通配符)

6)某些特殊變量的值:

$*,$@

循環體:

一般來說,循環體中應該包括能夠用到VAR_NAME變量的值的命令或命令的組合;如果循環體中的命令並沒有用到VAR_NAME變量的值的話,列表元素個數 就是此次for循環的次數;

例子:

使用for循環寫一個腳本,計算1到100的數字之和;

#!/bin/bash

#

declare -i SUM=0

for I in {1..100} ;do

#let SUM+=$I

SUM=$[SUM+I]

done

echo "The summary is: $SUM"


總結奇數的和以及偶數的和:

#!/bin/bash

#

declare -i SUM=0

for I in {1..100..2} ;do

#let SUM+=$I

SUM=$[SUM+I]

done

echo "The summary is: $SUM"


#!/bin/bash

#

declare -i SUM=0

for I in {seq 0 2 100} ;do

#let SUM+=$I

SUM=$[SUM+I]

done

echo "The summary is: $SUM"



寫一個腳本,能夠通過-a或-d選項添加或刪除一個或多個用戶:

#!/bin/bash

#

if [ $# -lt 2 ];then

echo "Make sure more than TWO arguments."

exit 6

fi


if [ $1 == '-a' ];then

for I in "$@" ;do

if ! $I &> /dev/null;then

useradd $I &> /dev/null

echo $I | passwd --stdin $I $> /dev/null

echo "User $I created successfully and changed it's password it's username."

else

echo "User $I exists already."

fi

done

elif [ $1 == '-d' ]; then

for J in "$@" ;do

if $J &> /dev/null;then

userdel -r $J &> /dev/null

echo "User $J deleted already."

else

echo "User $J is not exist yet."

fi

done

else

echo "Usage: $(basename $0) {-a UNAME1 [UNAME2 ...] | -d UNAME1 [UNMAE2 ...]}"

exit 5

fi





for循環總結:

1.進入循環的條件:LIST中尚有未被取盡的元素;

2.退出循環的條件:LIST中的元素被取盡;

3.for循環幾乎不會出現死循環;

4.在執行循環的過程中,需要將整個LIST載入內存,因此對於大列表來說,可能會消耗較多的內存及CPU資源;



計算指定範圍內自然數的和:

#!/bin/bash

#

#declare命令聲明SUM初始值為0

declare -i SUM=0

#read命令與用戶進行交互

read -p "Please input TWO integer: " I1 I2

#設置兩個數I1和I2的值類型

if [[ $I1 =~ [^[:digit:]] ]];then

echo "$I1 must is an integer."

exit 7

fi


if [[ $I2 =~ [^[:digit:]] ]];then

echo "$I2 must is an integer."

exit 7

fi

#利用if選擇執行結構和for循環進行嵌套

if [ $I1 -gt $I2 ];then

for I in {seq $I2 $I1} ;do

SUM=$[SUM+I]

done

echo "The summary is: $SUM"

else

for I in {seq $I1 $I2} ;do

SUM=$[SUM+I]

done

echo "The summary is: $SUM"

fi





寫一個腳本,打印有“*”組成的倒置的等腰三角形:

********* 1行,0個空白字符,9個*

******* 2行,1個空白字符,7個*

***** 3行,2個空白字符,5個*

*** 4行,3個空白字符,3個*

* 5行,4個空白字符,1個*


N行,N-1個空白字符,2*(總行數-當前行號)+1個*


#!/bin/bash

#

if [ $# -ne 1 ];then

echo "Usage: $(basename $0) INTEGER."

exit 5

fi


if [[ $1 =~ [^[:digit:]] ]];then

echo "Usage: $(basename $0) INTEGER."

exit 5

fi

LINENUM=$1

for I in $(seq $LINENUM);do

for J in $(seq $[I-1]) ;do

echo -n " "

done

for K in $(seq $[2*(LINENUM-I)+1]); do

echo -n "*"

done

echo

done


打印九九乘法表:

第一行:1個

第二行:2個

...

第九行:9個


第一種方法:

#!/bin/bash

#

for I in {1..9} ;do

for J in $(seq $I);do

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

done

echo

done


第二種方法:

控制變量實現for循環--

#!/bin/bash

#

for (( I=1 ; I<=100 ; I++)) ; do

for (( J=1 ; J<=I ; J++)) ; do

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

done

echo

done



以上兩個例子,均使用for循環的嵌套;往往需要兩層的循環嵌套才能打印出平面效果;外層的for循環,負責控制行數輸出;內層的for循環,負責控制每一行中各個列的輸出;


2.通過控制變量實現for循環:

for(( exp1; exp2; exp3));do COMMANDS; done

可以在腳本中寫成如下格式:

for(( exp1; exp2; exp3));do

COMMANDS

done


exp1:表達式1,為指定的變量賦初始值

exp2:表達式2,此次循環的退出條件

exp3:表達式3,指定的變量的值的變化規律


計算1到100的自然數的和:

#!/bin/bash

#

for (( I=1 ; I<=100 ; I++));do

let SUM+=$I

done

echo "The summary is: $SUM"


bash腳本編程之for循環及應用