shell學習筆記(四)shell控制流結構


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語法結構
case 值 in
模式1)
 action command 1
   ;;
模式2)
 action command 2
   ;;
esac
 
case取值後面必須爲單詞in,每一模式必須以右括號」)」結束,取值能夠爲變量或常數,匹配發現取值符合某一模式後,其間全部命令開始執行直至兩個分號 ;; .模式匹配符*表示任意字符,?表示任意單字符,[.. ]表示類或範圍中任意字符
 
eg:
 
[root@viong_app1 soft]# cat case.sh
#!/bin/bash
FRUIT= $1      
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

相關文章
相關標籤/搜索