過程式編程語言:順序執(zhí)行,選擇執(zhí)行,循環(huán)執(zhí)行
1.if語句:條件選擇
(1) 執(zhí)行機制:逐條件進行判斷,第一次遇為“真”條件時,執(zhí)行其分支,而后結(jié)束整個if語句
- && 代表and
- || 代表or
(2)單分支
if 判斷條件;then
條件為真的分支代碼
fi
(3)雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
(4)多分支
if 判斷條件1; then
條件為真的分支代碼
elif 判斷條件2; then
條件為真的分支代碼
elif 判斷條件3; then
條件為真的分支代碼
else
以上條件都為假的分支代碼
fi
(5)If示例
根據(jù)命令的退出狀態(tà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語句:條件判斷
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認分支
;;
esac
eg:打印棋盤
#!/bin/bash
for i in $(seq 16);do
let m=$i%4
case $m in
1|2)
for j in $(seq 4);do
echo -ne "\033[42m \033[0m"
echo -ne "\033[46m \033[0m"
done
;;
3|0)
for j in $(seq 4);do
echo -ne "\033[46m \033[0m"
echo -ne "\033[42m \033[0m"
done
;;
esac
echo
done
運行結(jié)果:

Paste_Image.png
3.for循環(huán)
(1) 執(zhí)行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執(zhí)
行一次循環(huán)體; 直到列表中的元素耗盡,循環(huán)結(jié)束
for 變量名 in 列表;do
循環(huán)體
done
(2)列表生成方式:
(1) 直接給出列表
(2) 整數(shù)列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用;
$@, $*
(3)for循環(huán)的特殊格式:
- 雙小括號方法,即((…))格式,也可以用于算術(shù)運算
- 雙小括號方法也可以使bash Shell實現(xiàn)C語言風格的變量操作I=10((I++))
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達
式))
do
循環(huán)體
done
? 控制變量初始化:僅在運行到循環(huán)代碼段時執(zhí)行一次
? 控制變量的修正表達式:每輪循環(huán)結(jié)束會先進行控制變量修正運算,而后再做條件判斷
eg:打印99乘法表
#!/bin/bash
for i in {1..9};do
for j in `seq $i`;do
let n=i*j
echo -en "$j*$i=$n\t"
done
echo
done
運行結(jié)果:

Paste_Image.png
eg:打印等腰三角形
#!/bin/bash
if [ $# -eq 0 ];then # $#代表所有參數(shù)個數(shù)
read -p "please input lines:" lines; #提示輸入?yún)?shù)
else
lines=$1 #把第一個參數(shù)賦值給lines
fi
if [[ $lines =~ ^[0-9]+$ ]] ;then #判斷是不是輸入的數(shù)字
[ $lines -eq 0 ] && { echo lines can not is zero;exit 1; }
else
echo lines must is digit
exit 2
fi
for i in `seq $lines`;do
for space in `seq $[lines-i]`;do
echo -n " "
done
for star in `seq $[2*i-1]`;do
declare -i N=$(($RANDOM%7+30))
if [[ $N -gt 31 && $N -lt 37 ]];then
echo -e "\033[1;${N};5m*\c\0mm"
else
echo -e "\033[31;5m*\c\0mm"
fi
done
echo
done
運行結(jié)果:

Paste_Image.png
4.while循環(huán)
while CONDITION; do
循環(huán)體
done
CONDITION:循環(huán)控制條件;進入循環(huán)之前,先做一次判斷;每一次循環(huán)之后會再次做判斷;條件為“true”,
則執(zhí)行一次循環(huán);直到條件測試狀態(tài)為“false”終止循環(huán)因此:CONDTION一般應(yīng)該有循環(huán)控制變量;而此變
量的值會在循環(huán)體不斷地被修正
進入條件:CONDITION為true
退出條件:CONDITION為false
while循環(huán)的特殊用法(遍歷文件的每一行):
while read line; do
循環(huán)體
done < /PATH/FROM/SOMEFILE
? 依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line
eg:打印棋盤
#!/bin/bash
i=0
while [ $i -lt 8 ];do
j=0
while [ $j -lt 8 ];do
let flags=(i+j)%2
if [ $flags -eq 0 ];then
echo -en "\033[42m \033[0m"
else
echo -en "\033[46m \033[0m"
fi
let j++
done
echo
let i++
done
運行結(jié)果:

Paste_Image.png
#!/bin/bash
i=0
while [ $i -lt 8 ];do
let a=$i%2
if [ $a -eq 0 ];then
j=0
while [ $j -lt 8 ];do
echo -en "\033[46m \033[0m"
echo -en "\033[42m \033[0m"
[ $j -eq 3 ] && echo
[ $j -eq 7 ] && echo
let j++
done
else
j=0
while [ $j -lt 8 ];do
echo -en "\033[42m \033[0m"
echo -en "\033[46m \033[0m"
[ $j -eq 3 ] && echo
[ $j -eq 7 ] && echo
let j++
done
fi
let i++
done
運行結(jié)果:

Paste_Image.png
5.until循環(huán)
until CONDITION; do
循環(huán)體
done
進入條件: CONDITION 為false
出條件: CONDITION 為true
6.循環(huán)控制語句continue
- 用于循環(huán)體中
- continue [N]:提前結(jié)束第N層的本輪循環(huán),而直接進入下一
輪判斷;最內(nèi)層為第1層
eg:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
7.循環(huán)控制語句break
? 用于循環(huán)體中
? break [N]:提前結(jié)束第N層循環(huán),最內(nèi)層為第1層
eg:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
8.循環(huán)控制shift命令
- shift [n]
? 用于將參量列表 list 左移指定次數(shù),缺省為左移一次。
? 參量列表 list 一旦被移動,最左端的那個參數(shù)就從列表中刪除。while 循環(huán)遍歷位置參量列表時,常用到 shift
eg:
? ./doit.sh a b c d e f g h
? ./shfit.sh a b c d e f g h
doit.sh
#!/bin/bash
# Name: doit.sh
# Purpose: shift through command line arguments
# Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
echo $*
shift
done
shift.sh
#!/bin/bash
#step through all the positional parameters
until [ -z "$1" ]
do
echo "$1"
shift
done
echo
eg:創(chuàng)建用戶
#!/bin/bash
while [ $# -gt 0 ] #or (( $# > 0 ))
do
id $1 &>/dev/null && continue
useradd $1 && echo $1 is create
shift
done
9.創(chuàng)建無限循環(huán)
while true; do
循環(huán)體
done
until false; do
循環(huán)體
Done

Paste_Image.png
10.select循環(huán)與菜單
select variable in list
do
循環(huán)體命令
done
select 循環(huán)主要用于創(chuàng)建菜單,按數(shù)字順序排列的菜單項將顯示在標準錯誤上,并顯示 PS3 提示符,等待用戶輸入
? 用戶輸入菜單列表中的某個數(shù)字,執(zhí)行相應(yīng)的命令
? 用戶輸入被保存在內(nèi)置變量 REPLY 中
select與case
(1)select 是個無限循環(huán),因此要記住用 break 命令退出循環(huán),或用 exit 命令終止腳本。也可以按 ctrl+c退出循環(huán)
(2)select 經(jīng)常和 case 聯(lián)合使用
(3)與 for 循環(huán)類似,可以省略 in list,此時使用位置參量
#!/bin/bash
PS3="Please choose your menu:"
select menu in lamian humian yangroutang;do
case $REPLY in
1)
echo "The price is \$5"
;;
2)
echo "The price is \$6"
;;
3)
echo "The price is \$8"
;;
*)
echo "we haven't"
break
;;
esac
done
運行結(jié)果:

Paste_Image.png