一、for循環
? for 變量名 in 列表;do
循環體
done
? 執行機制:
依次將列表中的元素賦值給“變量名” ; 每次賦值后即執
行一次循環體; 直到列表中的元素耗盡,循環結束
? 列表生成方式:
(1) 直接給出列表
(2) 整數列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob, 如: *.sh
(5) 變量引用;
$@, $*
二、while循環
? while CONDITION; do
循環體
done
? CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之
后會再次做判斷;條件為“ true”,則執行一次循環;直到條件測試
狀態為“ false”終止循環
? 因此: CONDTION一般應該有循環控制變量;而此變量的值
會在循環體不斷地被修正
? 進入條件: CONDITION為true;
? 退出條件: CONDITION為false
三、until循環
? until CONDITION; do
循環體
? done
? 進入條件: CONDITION 為false
? 退出條件: CONDITION 為true
四、循環控制語句continue
? 用于循環體中
? continue [N]:提前結束第N層的本輪循環,而直接進入下一
輪判斷;最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2 ;then
continue
fi
CMDn
…
done
五、循環控制語句break
? 用于循環體中
? break [N]:提前結束第N層循環, 最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
break
fi
CMDn
…
done
作業:
1、使用循環語句,寫個腳本實現:
*
***
*******
*********
#!/bin/bash
#
read -p "input line number:" line
declare -i n=1
declare -i lie=1
while [ $n -le "$line" ];do
kong_number=$[$line-$n]
xing_number=$[1+2*($n-1)]
xing_start=$[$line-$n+1]
xing_end=$[$kong_number+$xing_number]
sum_lie=$[2*$kong_number+$xing_number]
declare -i lie=1
while [ "$lie" -le "$sum_lie" ];do
if [ "$lie" -ge "$xing_start" ] && [ "$lie" -le "$xing_end" ];then
echo -ne "\033[41m*\033[0m"
else
echo -ne "\033[31;45m \033[0m"
fi
let lie++
done
let n++
echo
done
~
2、用until循環實現國際象棋棋盤
#!/bin/bash
#print the chessboard
declare -i H=1
declare -i S=1
white="\033[1;41m \033[0m"
black="\033[1;47m \033[0m"
until [ $S -eq 9 ];do
Syu=$[$S%2]
if [ "$Syu" -eq 1 ]; then
while [ $H -le 8 ];do
yu=$[$H%2]
[ $yu -eq 0 ] && echo -ne "$white" || echo -ne "$black"
let H++
done
else
until [ $H -eq 9 ];do
yu=$[$H%2]
[ $yu -eq 0 ] && echo -ne "$black" || echo -ne "$white"
let H++
done
fi
declare -i H=1
let S++
echo
done
8-19 作業:
1、1、編寫服務腳本/root/bin/testsrv.sh,完成如下要求
(1) 腳本可接受參數:start, stop, restart, status
(2) 如果參數非此四者之一,提示使用格式后報錯退出
(3) 如是start:則創建/var/lock/subsys/SCRIPT_NAME, 并顯示“啟動成功”
考慮:如果事先已經啟動過一次,該如何處理?
(4) 如是stop:則刪除/var/lock/subsys/SCRIPT_NAME, 并顯示“停止完成”
考慮:如果事先已然停止過了,該如何處理?
(5) 如是restart,則先stop, 再start
考慮:如果本來沒有start,如何處理?
(6) 如是status, 則如果/var/lock/subsys/SCRIPT_NAME文件存在,則顯示“SCRIPT_NAMEis running…”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示“SCRIPT_NAME is stopped…”
其中:SCRIPT_NAME為當前腳本名
1 #!/bin/bash
2 #
3 PS3="input your chioce:"
4 select menu in start stop restart status
5 do
6 case $REPLY in
7 start)
8 find /var/lock/subsys/testsrv.sh &> /dev/null
9 if [ $? -eq 0 ] ;then
10 echo "file exist"
11 else
12 touch /var/lock/subsys/testsrv.sh
13 echo "file create successful"
14 fi
15 ;;
16 stop)
17 rm /var/lock/subsys/testsrv.sh &> /dev/null
18 [ $? -eq 0 ] && echo "停止完成" || echo "已經停止,無需重> 復"
19 ;;
20
21 restart)
22 rm -f /var/lock/subsys/testsrv.sh &> /dev/null
23 touch /var/lock/subsys/testsrv.sh
24 echo "restart successfully"
25 ;;
26
27 status)
28 find /var/lock/subsys/testsrv.sh
29 [ $? -eq 0 ] && echo "testsrv.sh running…" || echo "testsrv. sh is stopped.."
30 ;;
31 *)
32 echo "error" ;break
2、編寫腳本/root/bin/copycmd.sh
(1) 提示用戶輸入一個可執行命令名稱;
(2) 獲取此命令所依賴到的所有庫文件列表
(3) 復制命令至某目標目錄(例如/mnt/sysroot)下的對應路徑下;
如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd==> /mnt/sysroot/usr/bin/passwd
(4) 復制此命令依賴到的所有庫文件至目標目錄下的對應路徑下:
如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次復制完成一個命令后,不要退出,而是提示用戶鍵入新的要復制的命令,并重復完成上述功能;直到用戶輸入quit退出
#!/bin/bash
while true ;do
read -p "please input cmd:" cmd
if [[ "$cm" == "quit" ]];then
echo "exiting"
exit
else
cmd_path=`whereis $cmd | cut -d ' ' -f2`
cmd_lib_list=`ldd $cmd_path`
cp -a $cmd_path /tmp/test/temp_cp_dir
[ $? -eq 0 ] && echo "cp file successful" || echo "cp file error"
for i in cmd_lib_list;do
cp -a $i /tmp/test/temp_cp_dir
[ $? -eq 0 ] && echo "cp $i successful" || echo "cp lib $i error"
done
echo "cp $cmd successful"
fi
done
原創文章,作者:ldt195175108,如若轉載,請注明出處:http://www.www58058.com/37442