一胆绊、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)的改變:
- 第一次循環(huán)時(shí)鲸伴, $var 的內(nèi)容為 con1 堪藐;
- 第二次循環(huán)時(shí), $var 的內(nèi)容為 con2 挑围;
- 第三次循環(huán)時(shí), $var 的內(nèi)容為 con3 糖荒;
- ..
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