一、if 條件語句
格式:
if 條件表達(dá)式
then #當(dāng)條件為真時(shí)執(zhí)行以下語句
命令列表
else #為假時(shí)執(zhí)行以下語句
命令列表
fi
if 語句也可以嵌套使用
if 條件表達(dá)式1
then
if 條件表達(dá)式2
then
命令列表
else
if 條件表達(dá)式3
then
命令列表
else
命令列表
fi
fi
else
命令列表
fi
你可以進(jìn)行多層嵌套 一個(gè)if語句一定要跟一個(gè)fi 表示該層條件結(jié)束 否則會(huì)造成語法錯(cuò)誤結(jié)合前面講的 舉例如下:
這里先講一個(gè)條件語句中用到的命令test 表示測(cè)試test后面的條件是否為真
if test -f \"$1\"
then
lpr $1
else
if test -d \"$1\"
then
cd $1
lpr $1
else
echo \"$1不是文件或目錄\"
fi
fi
以上的例子還可以改成如下所示
if test -f \"$1\"
then
lpr $1
elif test -d \"$1\" #elif 同else if
then
(cd $1;lpr $1)
else
echo \"$1不是文件或目錄\"
fi
以上的例子不知您是否看懂是什么意思嗎?
假如我們現(xiàn)在將這個(gè)例子保存為prfile
chmod x prfile
執(zhí)行剛才的程序
./prfile aaa
這個(gè)例子是檢查你的輸入的參數(shù)是否是一個(gè)文件 如果是就打印 如果是一個(gè)目錄 先轉(zhuǎn)目錄再打印 如果即不是文件也不是目錄給出提示
二、多重條件測(cè)試語句case
格式:
case 字串 in
模式) 命令列表;;
模式) 命令列表;;
....
esac
多重條件語句是以case 開始以esac結(jié)束 中間可以有多個(gè)條件列表 功能是測(cè)試字串和和里面的模式有沒有匹配的,有就執(zhí)行里面的命令列表 模式也可以是*號(hào) 表示任意字串,每個(gè)模式里面的最后要心;;雙引號(hào)結(jié)束,否則會(huì)發(fā)生語法錯(cuò)誤。
現(xiàn)舉例如下:
case $1 in
*.c)
cc $1
;;
*.txt)
lpr $1
;;
*)
echo \"未知的類型\"
esac
假如將以上內(nèi)容保存在文件abc中
chmod x abc
執(zhí)行 ./abc a.c 將會(huì)對(duì)文件a.c進(jìn)行編譯
執(zhí)行 ./abc readme.txt 將會(huì)把文件通過打印機(jī)
假如我將以上內(nèi)容改一下,你是否會(huì)知道它的執(zhí)行結(jié)果?
case $1 in
*)
cc $1
;;
*.txt)
lpr $1
;;
*.c)
echo \"未知的類型\"
esac
shell中的變量
(1)常用系統(tǒng)變量
$# :保存程序命令行參數(shù)的數(shù)目
$? :保存前一個(gè)命令的返回碼
$0 :保存程序名
$* :以("$1 $2...")的形式保存所有輸入的命令行參數(shù)
$@ :以("$1""$2"...)的形式保存所有輸入的命令行參數(shù)
$$ 本程序的(進(jìn)程ID號(hào))PID
$! 上一個(gè)命令的PID
(2)定義變量
shell語言是非類型的解釋型語言,不象用C++/JAVA語言編程時(shí)需要事先聲明變量.給一
個(gè)變量賦值,實(shí)際上就是定義了變量.
在linux支持的所有shell中,都可以用賦值符號(hào)(=)為變量賦值.
如:
abc=9 (bash/pdksh不能在等號(hào)兩側(cè)留下空格 )
set abc = 9 (tcsh/csh)
由于shell程序的變量是無類型的,所以用戶可以使用同一個(gè)變量時(shí)而存放字符時(shí)而存放
整數(shù).
如:
name=abc (bash/pdksh)
set name = abc (tcsh)
在變量賦值之后,只需在變量前面加一個(gè)$去引用.
如:
echo $abc
4.shell程序中的條件表達(dá)式和test命令
在bash/pdksh中,命令test用于計(jì)算一個(gè)條件表達(dá)式的值.他們經(jīng)常在條件語句和循環(huán)
語句中被用來判斷某些條件是否滿足.
test命令的語法格式:
test expression
或者
[expression]
在test命令中,可以使用很多shell的內(nèi)部操作符.這些操作符介紹如下:
(1)字符串操作符 用于計(jì)算字符串表達(dá)式
test命令 | 含義
-----------------------------------------
Str1 = str2 | 當(dāng)str1與str2相同時(shí),返回True
Str1! = str2| 當(dāng)str1與str2不同時(shí),返回True
Str | 當(dāng)str不是空字符時(shí),返回True
-n str | 當(dāng)str的長度大于0時(shí),返回True
-z str | 當(dāng)str的長度是0時(shí),返回True
-----------------------------------------
(2)整數(shù)操作符具有和字符操作符類似的功能.只是他們的操作是針對(duì)整數(shù)
test表達(dá)式 | 含義
---------------------------------------------
Int1 -eq int2|當(dāng)int1等于int2時(shí),返回True
Int1 -ge int2|當(dāng)int1大于/等于int2時(shí),返回True
Int1 -le int2|當(dāng)int1小于/等于int2時(shí),返回True
Int1 -gt int2|當(dāng)int1大于int2時(shí),返回True
Int1 -ne int2|當(dāng)int1不等于int2時(shí),返回True
-----------------------------------------
(3)用于文件操作的操作符,他們能檢查:文件是否存在,文件類型等
test表達(dá)式 | 含義
------------------------------------------------
-d file |當(dāng)file是一個(gè)目錄時(shí),返回 True
-f file |當(dāng)file是一個(gè)普通文件時(shí),返回 True
-r file |當(dāng)file是一個(gè)刻讀文件時(shí),返回 True
-s file |當(dāng)file文件長度大于0時(shí),返回 True
-w file |當(dāng)file是一個(gè)可寫文件時(shí),返回 True
-x file |當(dāng)file是一個(gè)可執(zhí)行文件時(shí),返回 True
------------------------------------------------
(4)shell的邏輯操作符用于修飾/連接包含整數(shù),字符串,文件操作符的表達(dá)式
test表達(dá)式 | 含義
----------------------------------------------------------
! expr |當(dāng)expr的值是False時(shí),返回True
Expr1 -a expr2|當(dāng)expr1,expr2值同為True時(shí),返回True
Expr1 -o expr2|當(dāng)expr1,expr2的值至少有一個(gè)為True時(shí),返回True
-----------------------------------------------------------
注意:
tcsh shell 不使用test命令,但是tcsh中的表達(dá)式同樣能承擔(dān)相同的功能.tcsh
支持的表達(dá)式于C中的表達(dá)式相同.通常使用在if和while命令中.
tcsh表達(dá)式 | 含義
-------------------------------------------------------
Int1 <= int2 |當(dāng)int1小于/等于int2時(shí),返回True
Int1 >= int2 |當(dāng)int1大于/等于int2時(shí),返回True
Int1 < int2 |當(dāng)int1小于int2時(shí),返回True
Int1 > int2 |當(dāng)int1大于int2時(shí),返回True
Str1 == str2 |當(dāng)str1與str2相同時(shí),返回True
Str1 != str2 |當(dāng)str1與str2不同時(shí),返回True
-r file |當(dāng)file是一個(gè)可讀文件時(shí),返回True
-w file |當(dāng)file是一個(gè)可寫文件時(shí),返回True
-x file |當(dāng)file是一個(gè)可執(zhí)行文件時(shí),返回True
-e file |當(dāng)file存在時(shí),返回True
-o file |當(dāng)file文件的所有者是當(dāng)前用戶時(shí),返回True
-z file |當(dāng)file長度為0時(shí),返回True
-f file |當(dāng)file是一個(gè)普通文件時(shí),返回True
-d file |當(dāng)file是一個(gè)目錄時(shí),返回True
Exp1 || exp2 |當(dāng)exp1和exp2的值至少一個(gè)為True時(shí),返回True
Exp1 && exp2 |當(dāng)exp1和exp2的值同為True時(shí),返回True
! exp |當(dāng)exp的值為False時(shí),返回True
------例子------------------
if [ "$#" -eq 0 ]; then
echo "zero"
echo "$#"
else
echo "not zero"
fi
--------------------------