(一)算術(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 inseq 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í)使用位置參量