第十一章:使用結構化命令
使用if-then語句
if commandthen commandsfi
如果if後面的命令退出狀態代碼=0,那麼就執行then
另外一種形式
if command; then commandsfi
if-then-else語句
if commandthen commandselse commandsfi
如果if後面的命令退出狀態代碼=0,那麼就執行then,否則,執行else
嵌套if(else if)
if command1then commandselif command2then commandsfi
test命令
test命令可以判斷3類條件
1.數值比較
2.字串比較
3.檔案比較
格式:
test condition
在if語句中,可以使用方括弧[]
if test conditionthen commandsfi
或者
if [ command ]then commandsfi
注意:方括弧兩邊必須加入一個空格,不然會報錯
數值比較
比較 |
描述 |
n1 -eq n2 |
檢查n1是否與n2相等 |
n1 -ge n2 |
檢查n1是否大於或等於n2 |
n1 -gt n2 |
檢查n1是否大於n2 |
n1 -le n2 |
檢查n1是否下雨或等於n2 |
n1 -lt n2 |
檢查n1是否小於n2 |
n1 -ne n2 |
檢查n1是否不等於n2 |
可以用在變數上
注意:不能使用浮點數
字串比較
比較 |
描述 |
str1 = str2 |
檢查str1是否和str2相同 |
str1 != str2 |
檢查str1是否和str2不同 |
str1 < str2 |
檢查str1是否比str2小 |
str1 > str2 |
檢查str1是否比str2大 |
-n str1 |
檢查str1的長度是否非0 |
-z str1 |
檢查str1的長度是否為0 |
順序比較需要注意:
1.大於小於符號要轉義,不然會被識別為重新導向符號
2.test命令根據ASCII順序排序,與sort命令不同
字串長度
當變數為空白字串或者沒有初始化時,變成長度是0
Null 字元串或沒有初始化的變數可能會對程式有災難性影響,使用前最好先使用test命令中的-n和-z確認
檔案比較
比較 |
描述 |
-d file |
檢查file是否存在並且是否是一個目錄 |
-e file |
檢查file是否存在 |
-f file |
檢查file是否存在並且是否是一個檔案 |
-r file |
檢查file是否存在並可讀 |
-s |
檢查file是否存在並非空 |
-w |
檢查file是否存在並可寫 |
-x |
檢查file是否存在並可執行 |
-O |
檢查file是否存在並屬於目前使用者所有 |
-G |
檢查file是否存在並且預設組與目前使用者相同 |
file1 -nt file2 |
檢查file1是否比file2新 |
file1 -ot file2 |
檢查file1是否比file2舊 |
以檢查目錄為例:
if [ -d $HOME ]then cd $HOMEelse echo "$HOME is not a directory"fi
複合條件測試
[ condition1 ] || [ condition2 ]
[ condition1 ] && [ condition2 ]
if-then的進階特性
1.用於數學運算式的雙圓括弧
2.用於進階字串處理的雙方括弧
雙圓括弧允許將進階數學運算式放入比較中
格式:
(( expression ))
命令符號
符號 |
描述 |
val++ |
後增 |
val-- |
後減 |
++val |
先增 |
--val |
先減 |
! |
邏輯求反 |
~ |
位求反 |
** |
冪運算 |
<< |
左位移 |
>> |
右位移 |
& |
位布爾和 |
| |
位布爾或 |
&& |
邏輯和 |
|| |
邏輯或 |
雙方括弧格式
[[ expression ]]
提供了模式比對(pattern matching)特性,可以在其中使用Regex
if [ $USER == r* ]
case命令
命令格式:
case variable inpattern1 | pattern2) commands1;;pattern3) commands2;;*) default commands;;esac
bash中是可以在case中檢查字串的
從java到bash,文法轉變還是很大的,不過思想是不會變的
下面是一個簡單的樣本:
case $test inpork | beef | lamb ) echo "$test is meat!" echo "I like it!";;potato | tomato | eggplant ) echo "$test is a vegetable" echo "who likes it?";;*) echo "what's this?";;esac
在java7之前,這麼寫是不可以的,switch case中不支援string類型
轉貼請保留以下連結
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/