shell常用語法(續)
while循環語句
- 語法結構
while expr # 執行 expr
do # 若 expr 的退出狀態爲0,進入循環,否則退出while
commands # 循環體
done # 循環結束標誌,返回循環頂部
- 執行過程
先執行 expr,如果其退出狀態爲 0,就執行循環體。執行到關鍵字 done 後,回到循環的頂部,while 命令再次檢查 expr 的退出狀態。以此類推,循環將一直繼續下去,直到 expr 的退出狀態非 0 爲止。
until循環語句
- 語法結構
until expr # 執行 expr
do # 若expr的退出狀態非0,進入循環,否則退出until
commands # 循環體
done # 循環結束標誌,返回循環頂部
- 執行過程
與 while 循環類似,只是當 expr 退出狀態非 0 時才執行循環體,直到 expr 爲 0 時退出循環。
break和continue
break [n]
用於強行退出當前循環。
如果是嵌套循環,則 break 命令後面可以跟一數字 n,表示退出第 n 重循環(最裏面的爲第一重循環)。continue [n]
用於忽略本次循環的剩餘部分,回到循環的頂部,繼續下一次循環。
如果是嵌套循環,continue 命令後面也可跟一數字 n,表示回到第 n 重循環的頂部。
例1:一個二重循環,如何使用continue跳出循環
#!/bin/bash
#scriptname:script.sh
for month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
for week in 1 2 3 4
do
echo -n "processing the month of $month. OK?"
read ans
if [ "$ans"=n -o -z "$ans" ];then
continue 2
else
echo -n "processing week $week of $month?"
read ans
if [ "$ans"=n -o -z "$ans" ];then
continue
else
echo "Now processing week $week of $month"
sleep 1
echo "Done processing"
fi
fi
done
done
exit和sleep
- exit n
exit 命令用於退出腳本或當前進程。n 是一個從 0 到 255 的整數,0 表示成功退出,非零表示遇到某種失敗而非正常退出。該整數被保存在狀態變量 $? 中。 - sleep n
暫停 n 秒鐘
select循環和菜單
- 語法結構
select variable in list
do # 循環開始的標誌
commands # 循環變量每取一次值,循環體就執行一遍
done # 循環結束的標誌
- 說明
select 循環主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示 PS3 提示符,等待用戶輸入
用戶輸入菜單列表中的某個數字,執行相應的命令
用戶輸入被保存在內置變量 REPLY 中。
例2:用戶選擇想要執行的命令(輸入數字進行選擇)
#!/bin/bash
PS3="select a program to excute:"
select program in 'ls -F' pwd date
do
$program
done
select和case
- select
select 是個無限循環,因此要記住用 break 命令退出循環,或用 exit 命令終止腳本。也可以按 ctrl+c 退出循環。 - select 經常和 case 聯合使用
例3:
#!/bin/bash
PS3="please choose one of the three boys:"
select choice in tom dan guy
do
case $choice in
tom)
echo Tom is a cool dude!
break;;
dan | guy )
echo Dan and Guy are both wanderful.
break;;
*)
echo "$REPLY is not one of your choices"
echo "Try again"
;;
esac
done
循環控制 shift 命令
- shift [n]
用於將參量列表 list 左移指定次數,缺省爲左移一次。
參量列表 list 一旦被移動,最左端的那個參數就從列表中刪除。while 循環遍歷位置參量列表時,常用到 shift。
例4:
#!/bin/bash
#name:doit.sh
#usage:doit.sh [args]
#example: ./doit.sh a b c d e f g
while (($# > 0)) #or [$# -gt 0]
do
echo $*
shift
done
例5:
#!/bin/bash
#using 'shift' to step through all the positional parameters
until [ -z "$1" ] #until all parameters used up
do
echo "$1"
shift
done
echo
exit 0
隨機數和 expr 命令
- 生成隨機數的特殊變量
echo $RANDOM 範圍是: [0, 32767] - expr:通用的表達式計算命令
表達式中參數與操作符必須以空格分開,表達式中的運算可以是算術運算,比較運算,字符串運算和邏輯運算。
例如:
expr 5 % 3
expr 5 * 3 # 乘法符號必須被轉義
字符串操作
例6:
#!/bin/bash
dirname="/usr/bin/local/bin";
echo "dirname=$dirname"
echo -n '${#dirname}='; sleep 4;echo "${#dirname}"
echo
echo -n '${dirname:4}='; sleep 4;echo "${dirname:4}"
echo
echo -n '${dirname:8:6}='; sleep 4; echo ${dirname:8:6}
echo
echo -n '${dirname#*bin}='; sleep 4; echo ${dirname#*bin}
echo
echo -n '${dirname##*bin}='; sleep 4;echo ${dirname##*bin}
echo
echo -n '${dirname%bin}='; sleep 4;echo ${dirname%bin}
echo
echo -n '${dirname%%bin}='; sleep 4;echo ${dirname%%bin}
echo
echo -n '${dirname%bin*}='; sleep 4;echo ${dirname%bin*}
echo
echo -n '${dirname%%bin*}='; echo ${dirname%%bin*}
echo
echo -n '${dirname/bin/sbin}='; echo ${dirname/bin/sbin}
echo
echo -n '${dirname//bin/lib}='; echo ${dirname//bin/lib}
echo
echo -n '${dirname/bin*/lib}='; echo ${dirname/bin*/lib}
腳本調試
- sh –x 腳本名
該選項可以使用戶跟蹤腳本的執行,此時 shell 對腳本中每條命令的處理過程爲:先執行替換,然後顯示,再執行它。
shell 顯示腳本中的行時,會在行首添加一個加號 “ + ”。 - sh –v 腳本名
在執行腳本之前,按輸入的原樣打印腳本中的各行,
打印一行執行一行。 - sh –n 腳本名
對腳本進行語法檢查,但不執行腳本。如果存在語法錯誤,shell 會報錯,如果沒有錯誤,則不顯示任何內容。