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開始步進爲3到10,結果爲:4、7、10)
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循環:測試條件爲真,進入循環。測試條件爲假,退出循環。測試條件通常經過變量來描述,須要在循環體不斷地改變變量的值,以確保某一時刻測試條件爲假,進而結束循環。
1、while 測試條件;do
循環體
done
2、while循環:遍歷文本文件
語法格式:
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的用戶的用戶名、ID和SHELL;
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的擴展知識了。要知數組是怎麼樣,請看下一篇。