<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"
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))
var 是變量名
con1 con2 con3
是常量爪模,就是具體的數(shù)據(jù)
也可以是一個已經(jīng)被賦值的變量, 寫法${v1} ${v2}
以上面的例子來說,這個
$var
的變量內(nèi)容在循環(huán)工作時會動態(tài)的改變:
- 第一次循環(huán)時荚藻,
$var
的內(nèi)容為 con1 屋灌;- 第二次循環(huán)時,
$var
的內(nèi)容為 con2 应狱;- 第三次循環(huán)時共郭,
$var
的內(nèi)容為 con3 ;- ....
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í)行:
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é)果
補(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)璃岳。