shell腳本編程(二)——常用語法(續)

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 會報錯,如果沒有錯誤,則不顯示任何內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章