1. 程式人生 > >shell編程進階

shell編程進階

echo 左移 實現 操作 真的 lba ext pos 串操作

shell腳本編程進階主要包括流程控制,函數,數組,高級字符串操作和高級變量,在這裏,主要介紹流程控制。

流程控制主要是過程式編程語言,分為順序執行,選擇執行和循環執行。

  1. 條件選擇if語句

if語句分為單分支,雙分支和多分支三種,單分支只需輸入一段條件為真的分支代碼即可,而雙分支需要輸入兩段代碼,一段條件為真,一段條件為假,多分支更復雜,逐條進行判斷,第一次遇到真條件時,執行分支,然後fi結束整個if語句。

單分支:                               
      if  判斷條件;then                            
          條件為真的分支代碼                         
        fi 
                                         
雙分支:                                            
            if    判斷條件;then
               條件為真的分支代碼
       else 
               條件為假的分支代碼 
       fi                                                                             fi
多分支:
       if    判斷條件1;then
                 條件為真的分支代碼
       elif  判斷條件2;then
                 條件為真的分支代碼
       elif  判斷條件3;then
                 條件為真的分支代碼
       else
                 以上條件都為假的分支代碼
       fi

示例:

編輯腳本/root/bin/fi1.sh,實現如下功能:輸入一個數字,當這個數字等於5時,輸出middle,當這個數字大於等於0小於5時,輸出small,當這個數字小於0時,輸出error,否則,輸出big。

#!/bin/bash
if [ $1 -eq 5 ];then
        echo "middle"
elif [ $1 -lt 5 -a $1 -ge 0 ];then
        echo "small"
elif [ $1 -lt 0 ];then
        echo "error"
else
        echo "big"
fi

技術分享圖片

註:用【】進行條件判斷時要註意前中後都有空格,腳本編寫完成後不要忘了加執行權限,用.或source執行腳本。

2.條件判斷case語句

case語句是先引用一個變量,之後把每個判斷條件輸入各個分支中,以esac為結尾。

case 變量引用 in
PAT1)
          分支1
          ;;
PAT2)
          分支2
          ;;
...
*)
          默認分支
          ;;
esac

註:case支持glob風格的通配符:

                *: 任意長度任意字符
                ?: 任意單個字符
                []:指定範圍內的任意單個字符
                a|b: a或b

示例:

編輯腳本/root/bin/case1.sh,如果輸入的是boy,m,ae,n,male,則輸出 Gentleman,若是輸入的是 girl,wom,ae,n,female,則輸出Lady,否則,輸出Error。

#!/bin/bash
case $1 in
        boy|m[ae]n|male)echo "Gentleman";;
        girl|wom[ae]n|female)echo "Lady";;
        *)echo "Error";;
esac

技術分享圖片

註:每行代碼編寫完成後不要忘了“;;”。

循環執行是比較重要的部分。循環執行就是將某代碼段重復運行多次,有進入條件和退出條件。

3.for 循環
依次將列表中的元素賦值給“變量名”; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束

for 變量名 in 列表;do
     循環體
done

列表生成方式:
(1) 直接給出列表
(2) 整數列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用;
$@, $*

示例:

編輯腳本/root/bin/xin.sh,實現打印紅心矩形

#!/bin/bash
for i in {1..10};do
    for n in {1..10};do
        echo -en '\033[31m?\033[0m'
    done
    echo 
done

技術分享圖片

註:for循環可以套其他的循環,其他的循環也可以套for循環

4.while循環

while 循環控制條件;do
          循環體
done

實驗:把分區利用率大於10%的分區顯示 sda5 will be full : 30%

#!/bin/bash
df |grep sd |while read disk ;do
    diskname=$(echo $disk |cut -d' ' -f1)
    diskusage=$(echo $disk |sed -r 's/.* ([0-9]+)%.*/\1/')
    [ $diskusage -ge 10 ] && echo "$diskname will be full: ${diskusage}%"
done

技術分享圖片

CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件
為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環
CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:CONDITION為true
退出條件:CONDITION為false

while CONDITION; do
                循環體
done

5.循環控制語句continue

用於循環體中
continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

while CONDTIITON1; do
        CMD1
        ...
        if CONDITION2; then
                  continue
        fi
        CMDn
        ...
done

示例:

運用while循環輸出1~9

while [ $n -lt 10 ];do
    echo $n
    let n++
    if [ $n -eq 5 ];then
        continue
    fi
done

技術分享圖片

6.循環控制語句break

用於循環體中
break [N]:提前結束第N層循環,最內層為第1層

while CONDTIITON1; do
        CMD1
        ...
        if CONDITION2; then
                   break
        fi
        CMDn
        ...
done

7.until循環
進入條件: CONDITION 為false
退出條件: CONDITION 為true

until CONDITION; do
       循環體
done

示例:

運用until循環輸出1~09

until [ $n -eq 10 ];do
    echo $n
    let n++
done

技術分享圖片

註:until循環語句條件判斷為假才能循環下去,跟while循環除了這個判斷條件其他都一樣。

8.循環控制語句shift

shift [n]
用於將參量列表 list 左移指定次數,缺省為左移一次。
參量列表 list 一旦被移動,最左端的那個參數就從列表中刪除。while 循環
遍歷位置參量列表時,常用到 shift
./doit.sh a b c d e f g h

示例:

doit.sh

#!/bin/bash
# Name: doit.sh
# Purpose: shift through command line arguments
# Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
  echo $*
  shift
done

技術分享圖片



shell編程進階