Shell 流程控制
和Java纬纪、PHP等語言不一樣,sh的流程控制不可為空站粟,如(以下為PHP流程控制寫法):
<?php
if (isset($_GET["q"])) {
search(q);
}
else {
// 不做任何事情
}
在sh/bash里可不能這么寫,如果else分支沒有語句執(zhí)行厨喂,就不要寫這個else和措。
if else
if
if 語句語法格式:
if condition
then
command1
command2
...
commandN
fi
寫成一行(適用于終端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
末尾的fi就是if倒過來拼寫,后面還會遇到類似的.
if else
if else 語法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else
if else-if else 語法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
以下實例判斷兩個變量是否相等:
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "沒有符合的條件"
fi
輸出結(jié)果:
a 小于 b
if else語句經(jīng)常與test命令結(jié)合使用蜕煌,如下所示:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '兩個數(shù)字相等!'
else
echo '兩個數(shù)字不相等!'
fi
輸出結(jié)果:兩個數(shù)字相等!
for 循環(huán)
與其他編程語言類似派阱,Shell支持for循環(huán)。
for循環(huán)一般格式為:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
寫成一行:
for var in item1 item2 ... itemN; do command1; command2… done;
當變量值在列表里斜纪,for循環(huán)即執(zhí)行一次所有命令贫母,使用變量名獲取列表中的當前取值。命令可為任何有效的shell命令和語句盒刚。in列表可以包含替換腺劣、字符串和文件名。
in列表是可選的因块,如果不用它橘原,for循環(huán)使用命令行的位置參數(shù)。
例如涡上,順序輸出當前列表中的數(shù)字:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
輸出結(jié)果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
while 語句
while循環(huán)用于不斷執(zhí)行一系列命令趾断,也用于從輸入文件中讀取數(shù)據(jù);命令通常為測試條件吓懈。其格式為:
while condition
do
command
done
以下是一個基本的while循環(huán)歼冰,測試條件是:如果int小于等于5靡狞,那么條件返回真耻警。int從0開始,每次循環(huán)處理時甸怕,int加1甘穿。運行上述腳本,返回數(shù)字1到5梢杭,然后終止温兼。
#!/bin/sh
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
使用中使用了 Bash let 命令,它用于執(zhí)行一個或多個表達式武契,變量計算中不需要加上 $ 來表示變量募判,具體可查閱:Bash let 命令
。while循環(huán)可用于讀取鍵盤信息咒唆。下面的例子中届垫,輸入信息被設(shè)置為變量FILM,按<Ctrl-D>結(jié)束循環(huán)全释。
echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的電影名: '
while read FILM
do
echo "是的装处!$FILM 是一部好電影"
done
無限循環(huán)
無限循環(huán)語法格式:
while :
do
command
done
或者
while true
do
command
done
or
for (( ; ; ))
until 循環(huán)
until循環(huán)執(zhí)行一系列命令直至條件為真時停止。
until循環(huán)與while循環(huán)在處理方式上剛好相反浸船。
一般while循環(huán)優(yōu)于until循環(huán)妄迁,但在某些時候—也只是極少數(shù)情況下寝蹈,until循環(huán)更加有用。
until 語法格式:
until condition
do
command
done
條件可為任意測試條件登淘,測試發(fā)生在循環(huán)末尾箫老,因此循環(huán)至少執(zhí)行一次—請注意這一點。
case
Shell case語句為多選擇語句形帮〔郾梗可以用case語句匹配一個值與一個模式,如果匹配成功辩撑,執(zhí)行相匹配的命令界斜。case語句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值后面必須為單詞in合冀,每一模式必須以右括號結(jié)束各薇。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后君躺,其間所有命令開始執(zhí)行直至 ;;峭判。
取值將檢測匹配的每一個模式。一旦模式匹配棕叫,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式林螃。如果無一匹配模式,使用星號 * 捕獲該值俺泣,再執(zhí)行后面的命令疗认。
跳出循環(huán)
在循環(huán)過程中,有時候需要在未達到循環(huán)結(jié)束條件時強制跳出循環(huán)伏钠,Shell使用兩個命令來實現(xiàn)該功能:break和continue横漏。
break命令
break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))。
continue
continue命令與break命令類似熟掂,只有一點差別缎浇,它不會跳出所有循環(huán),僅僅跳出當前循環(huán)赴肚。
esac
case的語法和C family語言差別很大素跺,它需要一個esac(就是case反過來)作為結(jié)束標記,每個case分支用右圓括號誉券,用兩個分號表示break指厌。