shell學習筆記(四)shell控制流結構目錄:程序員
=======================================================shell
條件語句
if語法結構
循環語句
for語法結構
1.for … in 語句
2.for((賦值;條件;運算語句))
while語法結構
until語法結構
break和continue控制
選擇語句
case語法結構express
========================================================bash
條件語句
if語法結構
if 條件1
若是條件1爲真
then
那麼
action command1
執行命令1
elif 條件
若是條件1不成立
then
那麼
action command 2
執行命令2
else
若是條件1與條件2都不成立
action command 3
執行命令3
fi
完成
--------------------------------------------------------------
eg:
[root@viong_app1 soft]#
cat if.sh
#!/bin/sh
scores=85;
if [ $scores -gt 90 ]; then
#[ ]中的值必須是[空格expression空格]
echo "very good!";
elif [ $scores -gt 80 ]; then
echo "good!";
elif [ $scores -gt 60 ]; then
echo "pass!";
else
echo "no pass!";
fi;
[root@viong_app1 soft]#
chmod 755 if.sh
[root@viong_app1 soft]#
./if.sh
good!
--------------------------------------------------------------
[root@viong_app1 soft]#
cat if1.sh
#!/bin/bash
echo -n "Enter you name:"
read NAME
if [ -z $NAME ] || [ "$NAME" = "" ];then
echo "You don't enter a name"
elif [ "$NAME" = root ];then
echo "hello root"
else
echo "hello $NAME"
fi
[root@viong_app1 soft]# ./if1.sh
輸入爲root則打印echo hello root
Enter you name:root
hello root
[root@viong_app1 soft]# ./if1.sh 輸入爲任意字符未匹配1 2 條件則echo hello $NAME
Enter you name:viong
hello viong
[root@viong_app1 soft]# ./if1.sh
輸入爲空字符或者空格則打印echo You don't enter a name
Enter you name:
You don't enter a name
簡單結構:
if 條件1
若是條件1爲真
then
那麼
action command 1 執行命令1
fi
完成
eg:
[root@viong_app1 soft]#
if [ 10 -lt 21 ];then echo "YES";fi;
YES
條件測試有:[[]],[],test 這幾種,注意:if與[ ]用空格分開,[ ]與變量之間用空格分開
[ ]內是整數時不能使用條件運算符
shell命令,能夠按照分號分割,也能夠按照換行符分割。若是想一行寫入多個命令,能夠經過「';」分割
循環語句
for語法結構
1.for … in 語句
for 變量 in 列表
do
action command1
action command2
done
當變量值在列表裏,for循環即執行一次全部命令,使用變量名訪問列表中取值
只要用
空格字符分割,每次for…in 讀取時候,就會
按順序將讀到值,給前面的變量
命令可爲任何有效的shell命令和語句
變量名爲任何單詞
in列表用法是可選,若是不用它,for循環使用命令行的位置參數
in列表能夠包含替換,字符串和文件名
[root@viong_app1 soft]#
cat for.sh
#!/bin/bash
#for
for abc in {1..5}
do
echo $abc
done
[root@viong_app1 soft]#
./for.sh
1
2
3
4
5
這腳本實現至關於seq命令
[root@viong_app1 soft]# seq 5
1
2
3
4
5
------------------------------------------------------
[root@viong_app1 soft]#
cat for.sh
#!/bin/bash
#for
for abc in 「lin hong viong」 注意:若是把雙引號去掉就變成三個字符換行打印出來
do
echo $abc
done
[root@viong_app1 soft]# ./for.sh
lin hong viong
2.for((賦值;條件;運算語句))
for((賦值;條件;運算語句))
do
action command
done;
eg:
[root@viong_app1 soft]#
cat for2.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo $i
done
[root@viong_app1 soft]#
./for2.sh
1
2
3
4
5
6
7
8
9
10
while語法結構
while action command1
do
action command2
action command3
done
注:在while
和do
之間雖然一般只使用一個命令,但能夠放幾個命令,命令一般用做測試條件
eg:
[root@viong_app1 soft]#
cat ./while.sh
#!/bin/bash
i=5
while [ $i -ge 1 ]
do
echo $i
((i--))
#必須是雙括號或者[ i-- ]
done
[root@viong_app1 soft]#
./while.sh
5
4
3
2
1
------------------------------------------------------
[root@viong_app1 soft]#
cat while2.sh
#!/bin/bash
echo "按住<ctrl>+D退出輸入."
while echo -n "輸入你最喜歡的電影:";read FILM
do
echo "Yeah,$FILM是一部好電影!"
done
[root@viong_app1 soft]#
./while2.sh
按住<ctrl>+D退出輸入.
輸入你最喜歡的電影:鐵甲鋼拳
Yeah,鐵甲鋼拳是一部好電影!
輸入你最喜歡的電影:[root@viong_app1 soft]#
[root@viong_app1 soft]# cat name
1
2
3
4
5
6
[root@viong_app1 soft]# cat while1.sh
#!/bin/bash
while read LINE
do
echo $LINE
done<name
[root@viong_app1 soft]# ./while1.sh
1
2
3
4
5
6
若是把name放在 while read LINE<name只會無次數地循環顯示第一行,即1
until語法結構
until 條件
do
action command 1
action command 2
done
注意:條件可爲任意測試條件,測試發生在循環末尾,所以循環至少執行一次
until提供循環執行,它與while循環相反,
until
循環將反覆執行直到條件爲真就結束循環,而while循環條件爲假就結束循環。until並無等價的while那麼好用,並且許多shell版本不支持,BASH支持,因此不少程序員不喜歡用
eg:
[root@viong_app1 soft]# cat until.sh
#!/bin/bash
X=1
until (( X > 10 ))
do
echo hello X is $X
let X=X+1
done
[root@viong_app1 soft]# ./until.sh
hello X is 1
hello X is 2
hello X is 3
hello X is 4
hello X is 5
hello X is 6
hello X is 7
hello X is 8
hello X is 9
hello X is 10
break和continue控制
break [n]
退出循環
若是是在一個嵌入循環裏,能夠指定n來跳出的循環個數
eg:
[root@viong_app1 soft]#
cat break.sh
#!/bin/bash
#break
while : #冒號表明一直爲真,一直循環下去
do
echo -n "Enter any Nun[1..5]:"
read NUN
case $NUN in
1|2|3|4|5)
echo "You enter a number between 1 and 5"
;;
*)
echo "Wrong number.bye"
break
;;
esac
done
[root@viong_app1 soft]#
./break.sh
Enter any Nun[1..5]:1
You enter a number between 1 and 5
Enter any Nun[1..5]:2
You enter a number between 1 and 5
Enter any Nun[1..5]:a
Wrong number.bye
-----------------------------------------
continue
跳出循環步
注:continue命令相似於break命令,只有一點重要差異,它不會跳出循環,只是跳出這個循環步
eg:
[root@viong_app1 soft]#
cat continue.sh
#!/bin/bash
#continue
while : #冒號表明一直爲真,一直循環下去
do
echo -n "Enter any Nun[1..5]:"
read NUN
case $NUN in
1|2|3|4|5)
echo "You enter a number between 1 and 5"
;;
*)
echo "Wrong number,continue(y/n)?:"
read CONTINUE
case $CONTINUE in
y|yes|Y|yes)
continue
;;
*)
break
;;
esac
esac
done
[root@viong_app1 soft]#
./continue.sh
Enter any Nun[1..5]:3
You enter a number between 1 and 5
Enter any Nun[1..5]:a
Wrong number,continue(y/n)?:
y
Enter any Nun[1..5]:b
Wrong number,continue(y/n)?:
n
選擇語句
case語句爲多選擇語句,能夠用case語句匹配一個值與一個模式,若是匹配成功,執行相匹配的命令
case 值 in
模式1)
action command 1
;;
模式2)
action command 2
;;
esac
case取值後面必須爲單詞in,每一模式必須以右括號」)」結束,取值能夠爲變量或常數,匹配發現取值符合某一模式後,其間全部命令開始執行直至兩個分號 ;; .模式匹配符*表示任意字符,?表示任意單字符,[.. ]表示類或範圍中任意字符
eg:
[root@viong_app1 soft]# cat case.sh
#!/bin/bash
if [ -z "$1" ]
then
echo "沒有在第一個參數輸入水果"
else
case "$FRUIT" in
apple|APPLE) echo "THE FRUIT is apple";;
banana|BANANA) echo "THE FRULT is banana";;
*) echo "輸入的是否是我要的水果啊?";;
esac
fi
[root@viong_app1 soft]# ./case.sh
沒有在第一個參數輸入水果
[root@viong_app1 soft]# ./case.sh apple
THE FRUIT is apple
[root@viong_app1 soft]# ./case.sh app
輸入的是否是我要的水果啊?
$1是外部傳參的值,經過這個例子就能想到平時相似server httpd restart命令,就是利用case調用app