bash腳本編程之for循環及應用
循環結構包括兩個環節;
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循環及應用