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