1.ifweb
"if" 表達式 若是條件爲真則執行then後面的部分:shell
if ....; thenexpress
....編程
elif ....; thenbash
....ssh
else函數
....oop
fi測試
大多數狀況下,可使用測試命令來對條件進行測試。好比能夠比較字符串、判斷文件是否存在及是否可讀等等…命令行
一般用" [ ] "來表示條件測試。注意這裏的空格很重要。要確保方括號的空格。
[ -f "somefile" ] :判斷是不是一個文件
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行權限
[ -n "$var" ] :判斷 $var變量是否有值
[ "$a" = "$b" ] :判斷 $a和 $b是否相等
執行man test能夠查看全部測試表達式能夠比較和判斷的類型。
直接執行如下腳本:
#!/bin/sh
if [ " $SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
變量 $SHELL包含了登陸shell的名稱,咱們和/bin/bash進行了比較。
快捷操做符
熟悉C語言的朋友可能會很喜歡下面的表達式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
這裏 && 就是一個快捷操做符,若是左邊的表達式爲真則執行右邊的語句。您也能夠認爲是邏輯運算中的與操做。上例中表示若是/etc/shadow文件存在則打印」 This computer uses shadow passwords」。一樣或操做(||)在shell編程中也是可用的。這裏有個例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r " $mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo " $mailfolder has mail from:"
grep "^From " $mailfolder
該腳本首先判斷mailfolder是否可讀。若是可讀則打印該文件中的"From" 一行。若是不可讀則或操做生效,打印錯誤信息後腳本退出。這裏有個問題,那就是咱們必須有兩個命令:
-打印錯誤信息
-退出程序
咱們使用花括號以匿名函數的形式將兩個命令放到一塊兒做爲一個命令使用。通常函數將在下文說起。
不用與和或操做符,咱們也能夠用if表達式做任何事情,可是使用與或操做符會更便利不少。
2.case
case :表達式能夠用來匹配一個給定的字符串,而不是數字。
case ... in
...) do something here ;;
esac
讓咱們看一個例子。 file命令能夠辨別出一個給定文件的文件類型,好比:
file lf.gz
這將返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
咱們利用這一點寫了一個叫作smartzip的腳本,該腳本能夠自動解壓bzip2, gzip 和zip類型的壓縮文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
" $1: Zip archive"*)
unzip " $1" ;;
" $1: gzip compressed"*)
gunzip " $1" ;;
" $1: bzip2 compressed"*)
bunzip2 " $1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到咱們在這裏使用了一個特殊的變量$1。該變量包含了傳遞給該程序的第一個參數值。
也就是說,當咱們運行:
smartzip articles.zip
$1 就是字符串 articles.zip
3. selsect
select 表達式是一種bash的擴展應用,尤爲擅長於交互式使用。用戶能夠從一組不一樣的值中進行選擇。
select var in ... ; do
break
done
.... now $var can be used ....
下面是一個例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是該腳本運行的結果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
注:var是個變量,能夠換成其它的值。break用來跳出循環,若是沒有break則一直循環下去。done與select對應。
4.loop
loop表達式:
while ...; do
....
done
while-loop 將運行直到表達式測試爲真。will run while the expression that we test for is true.
關鍵字"break" 用來跳出循環。而關鍵字」continue」用來不執行餘下的部分而直接跳到下一個循環。
for-loop表達式查看一個字符串列表 (字符串用空格分隔) 而後將其賦給一個變量:
1,for var in ....; do
....
done
在下面的例子中,將分別打印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
2,for (( 條件一; 條件二; 條件三 );do
...
done
例:
for ((i=1;i<10;i= $[$i+1]));do
echo "a"
done
輸出:
a
a
a
a
a
a
a
a
a
條件一:這能夠當作是『初始值』,如上面的例子中,初始值是 i=1 啦!
條件二:這能夠當作是『符合值』,如上面的例子中,當 i<=10的時候都是符合條件的!
條件三:這能夠當作是『步階』!也就是說,i每次都加一!因此啦!上面的例子是說:由i=1 開始到 i<= 100 ,每次 i 都加一來執行底下的程序段(就是 s=s+i ),當 i >100(也就是 i=101 )就跳出這一段程序段!
下面是一個更爲有用的腳本showrpm,其功能是打印一些RPM包的統計信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if [ -r " $rpmpackage" ];then
echo "=============== $rpmpackage =============="
rpm -qi -p $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
fi
done
這裏出現了第二個特殊的變量 $*,該變量包含了全部輸入的命令行參數值。
若是您運行showrpm openssh.rpm w3m.rpm webgrep.rpm
此時 $* 包含了 3 個字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
『until:直到條件相同的時候才離開程序』;
『while:當條件相同的時候,就繼續作!』
until [ condition1 ] && { || } [ condition2 ] ...