????????在上一篇博文中,主要介紹了Shell腳本編程的背景,怎樣創(chuàng)建人生中第一個(gè)Shell腳本以及Shell變量等內(nèi)容。接下來(lái)將接著介紹介紹Shell編程,主要是圍繞著Shell運(yùn)算、流程控制語(yǔ)句、自定義函數(shù)以及腳本調(diào)試等方面展開(kāi)。
一、運(yùn)算符
例:
num1=11
num2=22
sum=num1+num2
echo $sum
格式 : expr m + n 或$((m+n)) 注意expr運(yùn)算符間要有空格
expr命令:對(duì)整數(shù)型變量進(jìn)行算術(shù)運(yùn)算 (注意:運(yùn)算符前后必須要有空格)
expr 3 + 5
expr 3 – 5
echo `expr 10 / 3`
10/3的結(jié)果為3,因?yàn)槭侨≌?br>
expr 3 * 10 注意: \ 是轉(zhuǎn)義符

例:計(jì)算(2 +3 )×4 的值
1 .分步計(jì)算
S=`expr 2 + 3`
expr $S * 4
2.一步完成計(jì)算
expr `expr 2 + 3` * 4
S=`expr `expr 2 + 3` * 4`
echo $S
或
echo $(((2 + 3) * 4))

$()與${}的區(qū)別
$( )的用途和反引號(hào)``一樣,用來(lái)表示優(yōu)先執(zhí)行的命令
eg:echo $(ls test.sh)
就是取變量了eg:echo{PATH}
$((運(yùn)算內(nèi)容)) 適用于數(shù)值運(yùn)算
eg: echo $((3+1*4))
二、內(nèi)置test命令
內(nèi)置test命令常用操作符號(hào)[]表示,將表達(dá)式寫(xiě)在[]中,如下:
[ expression ]
或者:
test expression
注意:expression首尾都有個(gè)空格
eg: [ ] ;echo $?
測(cè)試范圍:整數(shù)、字符串、文件
表達(dá)式的結(jié)果為真,則test的返回值為0,否則為非0。當(dāng)表達(dá)式的結(jié)果為真時(shí),則變量$?的值就為0,否則為非0
1.字符串測(cè)試:
???????test str1 == str2 ?測(cè)試字符串是否相等
test str1 != str2 測(cè)試字符串是否不相等
test str1 ?? 測(cè)試字符串是否不為空,不為空,true,false
test -n str1 ?測(cè)試字符串是否不為空
test -z str1 ?測(cè)試字符串是否為空
eg:
name=linzhiling
[ “$name” ] && echo ok
?。?命令連接符號(hào)
&& 邏輯與 條件滿(mǎn)足,才執(zhí)行后面的語(yǔ)句
[ -z “$name” ] && echo invalid || echo ok
|| 邏輯或,條件不滿(mǎn)足,才執(zhí)行后面的語(yǔ)句
test “$name” == ”yangmi” && echo ok || echo invalid

2.整數(shù)測(cè)試:
???????test int1 -eq int2 ??測(cè)試整數(shù)是否相等 equals
test int1 -ge int2 ??測(cè)試int1是否>=int2
test int1 -gt int2 ???測(cè)試int1是否>int2
test int1 -le int2 ???測(cè)試int1是否<=int2
test int1 -lt int2 ????測(cè)試int1是否<int2
test int1 -ne int2 ??測(cè)試整數(shù)是否不相等
eg:
test 100 –gt 100
test 100 –ge 100
如下示例兩個(gè)變量值的大小比較:

3.文件測(cè)試:
???????test -d file ?????指定文件是否目錄
test –e file ????文件是否存在 exists
test -f file ??????指定文件是否常規(guī)文件
test –L File ???文件存在并且是一個(gè)符號(hào)鏈接
test -r file ??????指定文件是否可讀
test -w file ?????指定文件是否可寫(xiě)
test -x file ??????指定文件是否可執(zhí)行
eg:
test -d install.log
test –r install.log
test –f xx.log ; echo $?
[ -L service.soft ] && echo “is a link”
test -L /bin/sh ;echo $?
[ -f /root ] && echo “yes” || echo “no”
4.多重條件測(cè)試:
???????條件1 –a 條件2 邏輯與 兩個(gè)都成立,則為真
條件1 –o 條件2 邏輯或 只要有一個(gè)為真,則為真
?。?條件 邏輯非 取反
eg:
num=520
[ -n “num”–a“num” –ge 520 ] && echo “marry you” || echo “go on”
age=20
pathname=outlog
[ ! -d“$ pathname”] && echo usable || echo used

三、流程控制語(yǔ)句
1.if/else 命令
單分支if條件語(yǔ)句
???????if [ 條件判斷式 ]
then
程序
fi
或者
if [ 條件判斷式 ] ; then
程序
fi
eg:
#!/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
then
/etc/rc.d/init.d/httpd restart
fi
單分支條件語(yǔ)句需要注意幾個(gè)點(diǎn):
if語(yǔ)句使用fi結(jié)尾,和一般語(yǔ)言使用大括號(hào)結(jié)尾不同。
[ 條件判斷式 ] 就是使用test命令判斷,所以中括號(hào)和條件判斷式之間必須有空格
then后面跟符號(hào)條件之后執(zhí)行的程序,可以放在[]之后,用“;”分割,也可以換行寫(xiě)入,就不需要";"了。

多分支if條件語(yǔ)句
if [ 條件判斷式1 ]
then
當(dāng)條件判斷式1成立時(shí),執(zhí)行程序1
elif [ 條件判斷式2 ]
then
當(dāng)條件判斷式2成立時(shí),執(zhí)行程序2
...省略更多條件
else
當(dāng)所有條件都不成立時(shí),最后執(zhí)行此程序
fi
示例:
eg:
#!/bin/bash
read -p "please input your name:" NAME
#echo $NAME
if [ “$NAME” == root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME == tom ]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi

2.case in 命令
???????case命令是一個(gè)多分支的if/else命令,case變量的值用來(lái)匹配value1,value2,value3等等。匹配到后則執(zhí)行跟在后面的命令直到遇到雙分號(hào)為止(;;)case命令以esac作為終止符。

3.for 循環(huán)
???????for循環(huán)命令用來(lái)在一個(gè)列表?xiàng)l目中執(zhí)行有限次數(shù)的命令。比如,你可能會(huì)在一個(gè)姓名列表或文件列表中循環(huán)執(zhí)行同個(gè)命令。for命令后緊跟一個(gè)自定義變量、一個(gè)關(guān)鍵字in和一個(gè)字符串列表(可以是變量)。第一次執(zhí)行for循環(huán)時(shí),字符串列表中的第一個(gè)字符串會(huì)賦值給自定義變量,然后執(zhí)行循環(huán)命令,直到遇到done語(yǔ)句;第二次執(zhí)行for循環(huán)時(shí),會(huì)右推字符串列表中的第二個(gè)字符串給自定義變量,依次類(lèi)推,直到字符串列表遍歷完。
第一種:
for N in 1 2 3
do
echo $N
done
第二種:
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
4.while 循環(huán)
???????while命令根據(jù)緊跟其后的命令(command)來(lái)判斷是否執(zhí)行while循環(huán),當(dāng)command執(zhí)行后的返回值(exit status)為0時(shí),則執(zhí)行while循環(huán)語(yǔ)句塊,直到遇到done語(yǔ)句,然后再返回到while命令,判斷command的返回值,當(dāng)?shù)么蚍祷刂禐榉?時(shí),則終止while循環(huán)。
格式
while expression
do
command
…
done
實(shí)例:求1-10各個(gè)數(shù)的平方?

5.函數(shù)
???????函數(shù)代表著一個(gè)或一組命令的集合,表示一個(gè)功能模塊,常用于模塊化編程。
以下是關(guān)于函數(shù)的一些重要說(shuō)明:
在shell中,函數(shù)必須先定義,再調(diào)用
使用return value來(lái)獲取函數(shù)的返回值
函數(shù)在當(dāng)前shell中執(zhí)行,可以使用腳本中的變量。
結(jié)構(gòu)
完整:
function name() {
statements
[return value]
}
建議:
function name {
statements
[return value]
}
函數(shù)調(diào)用
調(diào)用 Shell 函數(shù)時(shí)可以給它傳遞參數(shù),也可以不傳遞。如果不傳遞參數(shù),直接給出函數(shù)名字即可:
name
如果傳遞參數(shù),那么多個(gè)參數(shù)之間以空格分隔:
name param1 param2 param3
注意:
1)不管是哪種形式,函數(shù)名字后面都不需要帶括號(hào)。
2)和其它編程語(yǔ)言不同的是,Shell 函數(shù)在定義時(shí)不能指明參數(shù),但是在調(diào)用時(shí)卻可以傳遞參數(shù),并且給它傳遞什么參數(shù)它就接收什么參數(shù)。
3)Shell 也不限制定義和調(diào)用的順序,你可以將定義放在調(diào)用的前面,也可以反過(guò)來(lái),將定義放在調(diào)用的后面。
