五、shell邏輯結(jié)構(gòu)

一胆绊、if 判斷

if ... then ... fi

如果...那么...

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

示例:

#!/usr/bin/env sh
read -p "請(qǐng)輸入一個(gè)整數(shù):" num

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

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

如果...那么...否則...

if [ 條件判斷式 ]; then
    當(dāng)條件判斷式成立時(shí)压状,可以進(jìn)行的指令工作內(nèi)容仆抵;
else
    當(dāng)條件判斷式不成立時(shí)菌瘪,可以進(jìn)行的指令工作內(nèi)容地淀;
fi

示例:

#!/usr/bin/bash
 read -p "please input ip : " ip
 ping -c1 $ip &>/dev/null
 if [ $? -eq 0 ];then
     echo "$ip is up."
 else
     echo "$ip is down!"
 fi

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

如果...又如果...又如果...否則...

elif 也是個(gè)判斷式同窘,因此出現(xiàn) elif 后面都要接 then 來(lái)處理祖搓!但是 else 已經(jīng)是最后的沒(méi)有成立的結(jié)果了锅移, 所以 else 后面并沒(méi)有 then

 if [ 條件判斷式一 ]; then
     當(dāng)條件判斷式一成立時(shí)奥邮,可以進(jìn)行的指令工作內(nèi)容闻丑;
 elif [ 條件判斷式二 ]; then
     當(dāng)條件判斷式二成立時(shí)懒构,可以進(jìn)行的指令工作內(nèi)容十兢;
 else
     當(dāng)條件判斷式一與二均不成立時(shí)趣竣,可以進(jìn)行的指令工作內(nèi)容;
 fi

示例

    read -p "請(qǐng)輸入一個(gè)常用的服務(wù)默認(rèn)端口號(hào):"  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

在判斷中支持正則

使用雙中括號(hào) [[ ]]
匹配 使用 =~
比如: [[ "$val" =~ [a-z]+ ]]
=~ 表示 匹配
[a-z+] 是正表達(dá)式旱物,不需要用任何引號(hào)遥缕,用了引號(hào)就會(huì)被識(shí)別為普通字符串
不匹配 使用 !

比如: [[ ! "$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/bash
read -p "please input port name : " port
if [[ "$port" =~ [0-9]+ ]];then
    if [ "$port" -eq 80 ];then
        echo "this is HTTP service"
    elif [ "$port" -eq 3306 ];then
        echo "this is Mysql service"
    elif [ "$port" -eq 20 ] || [ "$port" -eq 21 ];then
        echo "this is FTP service"
    fi
fi

while ... do ... done (不確定循環(huán))

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

每次循環(huán)體執(zhí)行完宵呛,while 都會(huì)檢查條件是否為真单匣,為真繼續(xù)循環(huán),否則終止循環(huán)。

n=0                                      //計(jì)數(shù)
while [ "$n" -lt 5 ]
do
   let n++
   echo "$n"
done

#!/usr/bin/bash
n=0
while [ $n -le 5 ]
    do
        read -p "please input a number : " num
        if [ $num -eq 18 ];then
            echo "nice"
        break
        elif [ $num -gt 18 ];then
            echo "You put in a big number"
        elif [ $num -lt 18 ];then
            echo "The number you entered is smaller"
        fi
    let n++
done

讀文件

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

計(jì)數(shù)

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

ps aux 示例

#!/usr/bin/bash
servername=$1
ps aux | grep -v "$0" | grep -v "grep" | grep "$servername" &>/dev/null
if [ "$?" -eq 0 ];then
    echo "$1 service is up"
else
    echo "$1 service is down"
fi

ping

#!/usr/bin/bash
while [ ture ]
do
read -p "please input ip : " ip
if [[ $ip =~ [0-9]+ ]];then
ping -c1 $ip &>/dev/null
else
    echo "error. ip is number."
    break
fi
if [ $? -eq 0 ];then
    echo "$ip is up."
else
    echo "$ip is down!"
fi
done

利用 case ..... esac 判斷

基本語(yǔ)法

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

示例

#!/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
        ;;
*)
        echo "Invalid input"
        ;;
esac

for do done (固定的循環(huán))

語(yǔ)法
for var in con1 con2 con3 ...
do
    程序段
done

for a in 1 2 3 4
do
echo "$a"
done

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

以上面的例子來(lái)說(shuō),這個(gè) $var 的變量?jī)?nèi)容在循環(huán)工作時(shí)會(huì)動(dòng)態(tài)的改變:

  1. 第一次循環(huán)時(shí)鲸伴, $var 的內(nèi)容為 con1 堪藐;
  2. 第二次循環(huán)時(shí), $var 的內(nèi)容為 con2 挑围;
  3. 第三次循環(huán)時(shí), $var 的內(nèi)容為 con3 糖荒;
  4. ..

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

a. 從一組字符串中取值

for a in 1 2 3 4
do
echo "$a"
done

b. 從位置變量中取值

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

c. 從累計(jì)變化的格式中取值

#!/bin/bash 

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

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

#!/bin/bash
for var in $(cat -n /etc/passwd)
do
    echo " ------------------------" 
    echo '$var   is' $var
done

IFS

修改 for 循環(huán)中的分界符,默認(rèn)是 空格
示例 a.txt 文件的內(nèi)容
ifs可以定義任意的字符為分隔符

# 先保存原來(lái)的值
old_ifs=$IFS

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

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

!/usr/bin/bash
oldIFS=${IFS}
IFS=$'\n'
for a in $(cat -n /etc/passwd)
do
echo "$a"
done
export IFS=${oldIFS}

循環(huán)嵌套

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

補(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     ==> 錯(cuò)誤
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)前層級(jí)的循環(huán)蜘矢。
  • break 后面可以接想跳出的層數(shù)
  • continue 是停止本次循環(huán)體內(nèi)的代碼,繼續(xù)進(jìn)行下一次循環(huán)综看。

單層break

for n in {1..5}
do
    if [ $n -eq 3 ];then
        echo "out"
        break
    fi
    echo "$n"
done
    echo "out $n"

單層continue

for n in {a..f}
do
    if [ $n == d ];then
    echo "out"
    continue
    fi
    echo "$n"
done
echo "$n over"

雙層continue

for a in {1..5}
do
    for b in {a..f}
    do
    if [ $b == c ];then
    echo "out"
    continue
    fi
        echo "$b"
    done
        echo "$a"
        echo "========"
done
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末品腹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子红碑,更是在濱河造成了極大的恐慌舞吭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析珊,死亡現(xiàn)場(chǎng)離奇詭異羡鸥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)忠寻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門惧浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奕剃,你說(shuō)我怎么就攤上這事衷旅。” “怎么了纵朋?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵柿顶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我倡蝙,道長(zhǎng)九串,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮猪钮,結(jié)果婚禮上品山,老公的妹妹穿的比我還像新娘。我一直安慰自己烤低,他們只是感情好肘交,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扑馁,像睡著了一般涯呻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腻要,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天复罐,我揣著相機(jī)與錄音,去河邊找鬼雄家。 笑死效诅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趟济。 我是一名探鬼主播乱投,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顷编!你這毒婦竟也來(lái)了戚炫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤媳纬,失蹤者是張志新(化名)和其女友劉穎双肤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钮惠,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杨伙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萌腿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片限匣。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毁菱,靈堂內(nèi)的尸體忽然破棺而出米死,到底是詐尸還是另有隱情,我是刑警寧澤贮庞,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布峦筒,位于F島的核電站,受9級(jí)特大地震影響窗慎,放射性物質(zhì)發(fā)生泄漏物喷。R本人自食惡果不足惜卤材,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峦失。 院中可真熱鬧扇丛,春花似錦、人聲如沸尉辑。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隧魄。三九已至卓练,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間购啄,已是汗流浹背襟企。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狮含,地道東北人整吆。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辉川,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拴测,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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