(2)shell腳本編程進(jìn)階之運(yùn)算和循環(huán)語(yǔ)句

(一)算術(shù)運(yùn)算

(1)bash 中的算術(shù)運(yùn)算:

help let +, -, *, /, % 取模(取余), ** (乘方)

(2)實(shí)現(xiàn)算術(shù)運(yùn)算:

  • (1) let var= 算術(shù)表達(dá)式
  • (2) var=$[ 算術(shù)表達(dá)式]
  • (3) var=$(( 算術(shù)表達(dá)式))
  • (4) var=$(expr arg1 arg2 arg3 ...)
  • (5) declare –i var = 數(shù)值
  • (6) echo ‘ 算術(shù)表達(dá)式’ | bc
  • (7) 乘法符號(hào)有的場(chǎng)景需要轉(zhuǎn)義*

(3)增強(qiáng)型賦值:+=, -=, *=, /=, %=

let var OPER value

例如:

let count+=3自加3后自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var--

(二)語(yǔ)句流程控制

(1)條件選擇if(if語(yǔ)句可以進(jìn)行嵌套)

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

Ps:

    根據(jù)命令的退出狀態(tài)來(lái)執(zhí)行命令
    if ping -c1 -W2 station1 &> /dev/null; then
                    echo 'Station1 is UP'
            elif grep "station1" ~/maintenance.txt &> /dev/null
                    then
                    echo 'Station1 is undergoing maintenance‘
            else
                    echo 'Station1 is unexpectedly DOWN!'
            exit 1
    fi

(2)case語(yǔ)句

條件判斷和函數(shù)結(jié)合可以Linux系統(tǒng)腳本經(jīng)常出現(xiàn)

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

(三)循環(huán)語(yǔ)句

(1)for循環(huán)

     for  變量名 in  列表;do
            循環(huán)體
    done

現(xiàn)在詳細(xì)解釋下for循環(huán)中的列表,又該如何去控制列表中的元素。
列表生成方式:

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

for循環(huán)的特殊格式

    for (( 控制變量初始化; 條件判斷表達(dá)式; 控制變量的修正表達(dá)式))
    do
            循環(huán)體
    done
  • 控制變量初始化:僅在運(yùn)行到循環(huán)代碼段時(shí)執(zhí)行一次
  • 控制變量的修正表達(dá)式:每輪循環(huán)結(jié)束會(huì)先進(jìn)行控制變量修正運(yùn)算,而后再做條件判斷
    #/bin/bash
    read -p "please enter MD5 encrypts the random number " num
    for j in seq 0 32767;
    do
    k=echo "$j" |md5sum|cut -c1-10
    if [[ $num == $k ]];then
    echo "$j"
    exit
    fi
    done
    (2)while 循環(huán)
    while CONDITION; do
    循環(huán)體
    done
  • CONDITION :循環(huán)控制條件;進(jìn)入循環(huán)之前,先做一次判
    斷;每一次循環(huán)之后會(huì)再次做判斷;條件為“true” ,則執(zhí)行
    一次循環(huán);直到條件測(cè)試狀態(tài)為“false”終止循環(huán)
  • 因此:CONDTION 一般應(yīng)該有循環(huán)控制變量;而此變量的值
    會(huì)在循環(huán)體不斷地被修正
  • 進(jìn)入條件:CONDITION 為true
  • 退出條件:CONDITION 為false

while 循環(huán)的特殊用法(遍歷文件的每一行):依次讀取/PATH/FROM/SOMEFILE 文件中的每一行,且將行賦值給變量line

    while read line; do
            循環(huán)體
    done < /PATH/FRO/SOMEFILE
    Ps:打印國(guó)際象棋的棋盤函數(shù)用while實(shí)現(xiàn)嵌套if函數(shù)
    #/bin/bash
    red(){ echo -e '\033[41m        \033[0m';}
    yellow(){ echo -e '\033[43m        \033[0m';}
    a=1
    while [ $a -le 10 ]
    do
    b=1
    while [ $b -le 10 ]
    do
            let c=$a+$b
            if [ `expr $c % 2` = "0" ]
            then
                    echo -en `red``red``red`
            else
                    echo -en `yellow``yellow``yellow`
            fi
            let b++
    done
            let a++
            echo
    done

(3)until循環(huán)
until CONDITION; do
循環(huán)體
done
進(jìn)入條件: CONDITION 為false
退出條件: CONDITION 為true
這里需要注意的是until和while的用法正好相反,while是條件判斷為真時(shí),繼續(xù)執(zhí)行循環(huán),但是until卻是條件判斷為假的時(shí)候卻是繼續(xù)執(zhí)行循環(huán)。所以,這樣就給我們了很好的選擇,但是在正常的生產(chǎn)構(gòu)成中卻是while和for語(yǔ)句用的稍微多一點(diǎn)。
#!/bin/bash
#step through all the positional parameters
until [ -z "$1" ]
do
echo "$1"
shift
done
echo
(4)循環(huán)控制語(yǔ)句continue
continue [N] :提前結(jié)束第N 層的本輪循環(huán),而直接進(jìn)入下一
輪判斷;最內(nèi)層為第1層
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue [N] #[N]的意思是我需要跳出幾次循環(huán)默認(rèn)為1是當(dāng)前循環(huán)
fi
CMDn
...
done
(5)循環(huán)控制shift 命令

  • shift [n]用于將參量列表 list 左移指定次數(shù),缺省為左移一次。
  • 參量列表 list 一旦被移動(dòng),最左端的那個(gè)參數(shù)就從列表中刪
    除。while 到 循環(huán)遍歷位置參量列表時(shí),常用到 shift
    while [ $# -gt 0 ] # or (( $# > 0 ))
    do
    echo $*
    shift
    done
    (6)無(wú)限循環(huán)(while、until)
    while true; do
    循環(huán)體
    done
    until false; do
    循環(huán)體
    done
    (8)select 循環(huán)與菜單
    select variable in list
    do
    循環(huán)體命令
    done
  • select 循環(huán)主要用于創(chuàng)建菜單,按數(shù)字順序排列的示菜單項(xiàng)將顯示在標(biāo)準(zhǔn)錯(cuò)誤上,并顯示 PS3 提示符,等待用戶輸入
  • 用戶輸入菜單列表中的某個(gè)數(shù)字,執(zhí)行相應(yīng)的命令
  • 用戶輸入被保存在內(nèi)置變量 REPLY 中
  • select 用 是個(gè)無(wú)限循環(huán),因此要記住用 break 命令退出循環(huán),或用 exit 按 命令終止腳本。也可以按 ctrl+c退出循環(huán)
  • select 和經(jīng)常和 case 聯(lián)合使用
  • 與 for 略循環(huán)類似,可以省略 in list,此時(shí)使用位置參量
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容