Shell_07_邏輯結(jié)構(gòu)

<meta charset="utf-8">

一、if 判斷

if ... then ... fi

單層
如果 是真的 那么 ...

if [ 條件判斷式 ];then
    當(dāng)條件判斷式成立時赡勘,可以進(jìn)行的命令津坑。
fi   # 結(jié)束這個判斷語句結(jié)構(gòu)

示例:
提示輸入一個整數(shù)哀澈,程序判斷輸入的值是否大于 18

風(fēng)格 1

#!/usr/bin/env sh

read -p "請輸入一個整數(shù):" num

if [ "$num" -gt 18 ];then
    echo "你輸入的數(shù)值大于 18"
fi

echo "hello..."

風(fēng)格2

#!/usr/bin/env sh

read -p "請輸入一個整數(shù):" num

if [ "$num" -gt 18 ]
then
    echo "你輸入的數(shù)值大于 18"
fi

echo "hello..."


if ... then ... else....fi

多重蜻底、復(fù)雜條件判斷式
如果 是真的 那么 ... 否則 ...

一顆紅心吼野,兩手準(zhǔn)備

if [ 條件判斷式 ]; then
    當(dāng)條件判斷式成立時,可以進(jìn)行的指令工作內(nèi)容诡宗;
else
    當(dāng)條件判斷式不成立時滔蝉,可以進(jìn)行的指令工作內(nèi)容;
fi

示例:

判斷用戶輸出的字符串
輸入 y
就輸出文本內(nèi)容 "script is running..."
否則輸出文本內(nèi)容 "STOP"

image

if ... elif ... elif ... else ... fi

多個條件判斷 (if ... elif ... elif ... else) 分多種不同情況執(zhí)行


if [ 條件判斷式一 ]; then
    當(dāng)條件判斷式一成立時塔沃,可以進(jìn)行的指令工作內(nèi)容蝠引;
elif [ 條件判斷式二 ]; then
    當(dāng)條件判斷式二成立時,可以進(jìn)行的指令工作內(nèi)容蛀柴;
else
    當(dāng)條件判斷式一與二均不成立時螃概,可以進(jìn)行的指令工作內(nèi)容;
fi

注意
elif 也是個判斷式鸽疾,因此出現(xiàn) elif 后面都要接 then 來處理吊洼!但是 else 已經(jīng)是最后的沒有成立的結(jié)果了, 所以 else 后面并沒有 then

示例

通過判斷輸入的整數(shù)制肮,判斷是什么常用服務(wù)

#!/usr/bin/env sh
read -p "請輸入一個常用的服務(wù)默認(rèn)端口號:"  port

if [ "$port" -eq 80 ];then
    echo "HTTP 服務(wù)"
elif [ "$port" -eq 3306 ];then
    echo "Mysql 服務(wù)"
elif [ "$port"  -eq  21 ] || [ "$port"  -eq  20 ];then
    echo "FTP 服務(wù)"
elif [ "$port" -eq 22 ];then
    echo "SSHD 服務(wù)"
elif [ "$port"  -eq 23 ];then
    echo "Telnet 服務(wù)"
else
   echo "未知服務(wù)"
fi

實戰(zhàn)案例

服務(wù)狀態(tài)檢測工具

通過獲取目前系統(tǒng)中的服務(wù)進(jìn)程冒窍,判斷都有那些服務(wù)處于運(yùn)行狀態(tài)

在判斷中支持正則

使用雙中括號 [[ ]]

  • 匹配 使用 =~

比如: [[ "$val" =~ [a-z]+ ]]

=~ 表示 匹配
[a-z+] 是正表達(dá)式,不需要用任何引號豺鼻,用了引號就會被識別為普通字符串

  • 不匹配 使用 !

比如: [[ ! "$val" =~ [0-9]+ ]]

示例

#!/usr/bin/env   sh
name=shark

if [[ "$name"  =~  [a-z]+ ]];then
   echo "ok"
fi

if [[ ! "$name" =~ [0-9]+ ]];then
   echo  "good"
fi

嵌套

#!/usr/bin/env sh
read -p "請輸入一個常用的服務(wù)默認(rèn)端口號:"  port

if [[ "$port" =~ [0-9]+ ]];then

    if [ "$port" -eq 80 ];then
        echo "HTTP 服務(wù)"
    elif [ "$port" -eq 3306 ];then
        echo "Mysql 服務(wù)"
    elif [ "$port"  -eq  21 ] || [ "$port"  -eq  20 ];then
        echo "FTP 服務(wù)"
    elif [ "$port" -eq 22 ];then
        echo "SSHD 服務(wù)"
    elif [ "$port"  -eq 23 ];then
        echo "Telnet 服務(wù)"
    else
       echo "未知服務(wù)"
    fi
else
    echo "number"
fi

二综液、 利用 case ..... esac 判斷

基本語法

case  $變量名稱 in       <==關(guān)鍵字為 case ,還有變量前有錢字號
  "第一個變量的值")       <==每個變量內(nèi)容建議用雙引號括起來儒飒,關(guān)鍵字則為小括號 )
    程序段
    ;;                  <==每個類別結(jié)尾使用兩個連續(xù)的分號來處理谬莹!
  "第二個變量的值")
    程序段
    ;;
  *)                    <==最后一個變量內(nèi)容都會用 * 來代表所有其他值
    不包含第一個變量內(nèi)容與第二個變量內(nèi)容的其他程序運(yùn)行段
    exit 1
    ;;
esac                    <==反過來寫,結(jié)束當(dāng)前語句結(jié)構(gòu)!

運(yùn)維工具箱

========================================================

模式還可以是多個

#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
read -p "Your choice" choice
case $choice in
m|M)
        free -m
        ;;
d|D)
        df -h
        ;;
q|Q)
        exit
        ;;
*)
        eco "Invalid input"
        ;;
esac

三桩了、while ... do ... done (不確定的循環(huán))

while [ condition ]  ==>中括號內(nèi)的狀態(tài)就是判斷式
do                   ==> do 是循環(huán)的開始附帽!
    命令或者代碼
    命令或者其他邏輯語句
done                 ==> done 是循環(huán)的結(jié)束

計數(shù)

每次循環(huán)體執(zhí)行完,while 都會檢查條件是否為真圣猎,為真繼續(xù)循環(huán)士葫,否則終止循環(huán)。

n=0
while [ "$n" -lt 5 ]
do
   let n++
   echo "$n"
done

讀文件

while read line
do
    echo $line
done < /etc/passwd

每次循環(huán)送悔, 都會把 /etc/passwd 中的每一個行內(nèi)容 賦值給變量 line

五慢显、 for do done (固定的循環(huán))

image

var 是變量名
con1 con2 con3 是常量爪模,就是具體的數(shù)據(jù)
也可以是一個已經(jīng)被賦值的變量, 寫法 ${v1} ${v2}

以上面的例子來說,這個 $var 的變量內(nèi)容在循環(huán)工作時會動態(tài)的改變:

  1. 第一次循環(huán)時荚藻, $var 的內(nèi)容為 con1 屋灌;
  2. 第二次循環(huán)時, $var 的內(nèi)容為 con2 应狱;
  3. 第三次循環(huán)時共郭, $var 的內(nèi)容為 con3 ;
  4. ....

for 循環(huán)中 變量的取值方式

a. 從一組字符串中取值

for  var     in    one    two    three   four   five 
do
    echo    "****************************"
    echo   '$var   is '    $var
done

b. 從位置變量中取值

for    var
do
    echo  '-----------------------------'
    echo   '$var   is '    $var
done

按照如下方式執(zhí)行:

image

c. 從累計變化的格式中取值

#!/bin/bash 

for    ((var=1;var<=10;var++))
do
    echo   "------------------------" 
    echo   '$var   is '    $var
done

d. 從命令結(jié)果中取值

#!/bin/bash
for   var   in   $(cat    file.txt)
do
    echo  " ------------------------" 
    echo   '$var   is '    $var
done

IFS

修改 for 循環(huán)中的分界符,默認(rèn)是 空格

示例 a.txt 文件的內(nèi)容

hello world name age
hello world name age

# 先保存原來的值
old_ifs=$IFS

# 設(shè)置分界符為 回車
IFS=$'\n'
for line in $(cat a.txt)
do
  echo $line
done

# 把變量的值回復(fù)成原來的狀態(tài)
export IFS=$old_ifs

嵌套循環(huán)

for n in {1..3}
do
    for i in {a..e}
    do
        echo "外層循環(huán)的值$n--內(nèi)層循環(huán)的值$i"
    done
    echo "----------------"
done

執(zhí)行結(jié)果

image

補(bǔ)充:數(shù)值運(yùn)算

?  ~ n=1
?  ~ let n++
?  ~ echo $n
2
?  ~ (( n++ ))
?  ~ echo $n
3
?  ~ a=2
?  ~ b=3
?  ~ let f=a+b
?  ~ echo $n
3
?  ~ echo $f
5
?  ~ let f = a + b     ==> 錯誤
zsh: bad math expression: operand expected at `='
?  ~ let "f = a + b"
?  ~ echo $f
5

六、break 和 continue

  • break 就是退出循環(huán),循環(huán)不再繼續(xù)了姨丈。假如是嵌套的循環(huán),就是退出當(dāng)前層級的循環(huán)尉咕。

  • continue 是停止本次循環(huán)體內(nèi)的代碼,繼續(xù)進(jìn)行下一次循環(huán)璃岳。

1. 單層循環(huán)的 break

示例代碼

image

運(yùn)行結(jié)果

image

2. 單層循環(huán)的 continue

示例代碼

image

執(zhí)行結(jié)果

image

3. 多層循環(huán)的 break

示例代碼

image

執(zhí)行結(jié)果

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末年缎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铃慷,更是在濱河造成了極大的恐慌单芜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犁柜,死亡現(xiàn)場離奇詭異洲鸠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赁温,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門坛怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淤齐,“玉大人股囊,你說我怎么就攤上這事「模” “怎么了稚疹?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祭务。 經(jīng)常有香客問我内狗,道長,這世上最難降的妖魔是什么义锥? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任柳沙,我火速辦了婚禮,結(jié)果婚禮上拌倍,老公的妹妹穿的比我還像新娘赂鲤。我一直安慰自己噪径,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布数初。 她就那樣靜靜地躺著找爱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泡孩。 梳的紋絲不亂的頭發(fā)上车摄,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音仑鸥,去河邊找鬼吮播。 笑死,一個胖子當(dāng)著我的面吹牛眼俊,可吹牛的內(nèi)容都是我干的薄料。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泵琳,長吁一口氣:“原來是場噩夢啊……” “哼摄职!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起获列,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谷市,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后击孩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫悠,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年巩梢,在試婚紗的時候發(fā)現(xiàn)自己被綠了创泄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡括蝠,死狀恐怖鞠抑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忌警,我是刑警寧澤搁拙,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站法绵,受9級特大地震影響箕速,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朋譬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一盐茎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徙赢,春花似錦字柠、人聲如沸滑进。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶关。三九已至,卻和暖如春数冬,著一層夾襖步出監(jiān)牢的瞬間节槐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工拐纱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铜异,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓秸架,卻偏偏與公主長得像揍庄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子东抹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容