Linux Bash Shell學習(九):流程控制——if/else
本文也即《Learning the bash Shell》3rd Edition的第五章Flow Control之讀書筆記,但我們將不限於此。flow control是任何程式語言中很常用的部分,也包括了bash。在這裡,我們將學習他們。
if/else是通過判斷選擇執行或者執行部分程式碼,可以根據變數、檔名、命令是否執行成功等很多條件進行判斷,他的格式如下:
if condition
then
statements
[elif condition
then statements. ..]
[else
statements ]
fi
和 C程式不一樣,bash的判斷不是通過boolean,而是通過statement,也就是執行命令後的最終狀態(exit status)。所有的Linux命令,無論你是程式碼是C還是指令碼,執行完,都返回一個整數通知他的呼叫這,這就是exit status,通常0表示OK,其他(1-255)表示錯誤。這只是通常的情況,例如diff,0表示你no difference,1表示difference,2表示錯誤。if判斷statements的最後一個的exit status,通常我們只放一個statement,如果為0,表示true,否則表示false。
執行下一條命令會沖掉原來exit status。可以使用$?來檢視上一命令執行的結果。例如我們希望用一個新的cd命令來替代原來在linux kernel中已將編譯的cd命令,由於function是優先於built-in命令,所以呼叫時,將呼叫我們的function。下面有一個例子,function pushd,在stack中鍵入cd的dirname路徑名,並執行跳到該路徑下。
cd ( )
{
#由於我們已經定義了具有更高優先順序別的function,如果希望呼叫原來built-in的命令,需要再前面加上builtin。
builtin cd "$@"
#$?是上一command的返回值,即builtin cd "$@"的值,並記錄在result裡面。
result=$?
echo "$OLDPWD --> $PWD"
#返回result的值。我們需要注意shell中的返回和在其他程式,例如C語言中的返回是不一樣的,只代表最後的exit statue,而不是所謂的返回值,雖然也用到了return。如何沒有最後的reture,例如後面的push_func,exit status就是最後執行的command的exit status
return $result
}push_func( )
{
dirname=$1
#如果dirname為null,退出funcuntion,如cd dirname成功,push the directory ,否則顯示still in $PWD,cd使用function的cd函式,其優先順序別高於已在核心編譯了的cd
if cd ${dirname:?"missing directory name."}
then
mystack="$dirname ${mystack:-$OLDPWD }"
echo $mystack
else
echo still in $PWD.
fi
}push_func $1
條件結合
和C語言一樣,可以進行條件結合,使用&&,||,以及!三種方式,表示“和”,“或”,與”非“,格式如下:if statement1 && statement2, if statement1 || statement2 ,if ! statement1 。
exit status不是判斷的唯一值,可以使用[...]和[[...]]。
字串比較
字串比較是放置在[...]中,有以下的幾種:
str1 = str2,字串1匹配字串2 str1 != str2,字串1不匹配字串2 str1 > str2,字串1大於字串2 str1 < str2,字串1小於字串2 -n str,字串不為null,長度大於零 -z str,字串為null,長度為零
需要注意<和>符號和重定向符號相似,為了避免歧義和錯誤,使用if [ $a /> $b ] 的方式 。仍然上面的例子,我們增加pop_func來操作stack:
pop_func()
{
mystack=${mystack#* }
#下面請至於[ ... ],即[後面有一個空格,]前面有一空格,另外$mystack用雙引號,表示這代表的是一個字串。注意到then不放在下一行,與if放在用一行,用;來隔開。
if [ -n "$mystack" ]; then
cd ${mystack%% *}
echo "$PWD", stack is [$mystack]
else
echo "stack empty, still in $PWD."
fi
}
例如,我們要求命令帶有引數,除了使用{1?"<message"}以外,下面給出更可讀的方式:
if [ -z "$1" ]; then
echo 'usage: c filename [-N]'
exit 1
fi
在這裡exit表示結束,退出,執行的結果為失敗,非零。
檔案屬性比較
檔案屬性比較是另一個常用的條件判斷型別。
-a file :file 存在 -d file :file存在並是一個目錄 -e file :file 存在,同- a -f file :file 存在並且是一個常規的檔案(不是目錄或者其他特殊型別檔案) -r file :有讀的許可權 -s file :檔案存在且不為空 -w file :有寫的許可權 -x file :有執行的許可權,或者對於目錄有search的許可權 -N file :在上次讀取後,檔案有改動 -O file :own所屬的檔案 -G file :group所屬的檔案 file1 -nt file2 :file1 比 file2 更新,以最後更新時間為準 file1 -ot file2 :file1 比 file2 更舊 ,以最後更新時間為準
這些在[ ... ]中的條件判斷是可以多個結合起來,例如if [ condition ] && [ condition ]; then,當然也可以if command && [ condition ]; then,不在類推。尤其我們可以進行復制的條件判斷。另外還可以使用-a 和-o ,等同於C語言中的&和|的邏輯計算復符號,他們和&&即||相似。當他們用在condition裡面。
在上面push_func的例子中,除了判斷是否引數之外,增加判斷是否是目錄名,如下:
if [ -n "$dirname" ] &&[ -d "$dirname" ]
then
cd $dirname
mystack="$dirname ${mystack:-$OLDPWD }"
echo $mystack
else
echo still in $PWD.
fi
我們在增加一個判斷,當時目錄名的時候,在檢查是否可以進行檢視或操作。使用if [ -n "$dirname" ] &&[ -d "$dirname" -a -x "$dirname" ],但是這種寫法很難閱讀,我們需要將兩個前後判斷括起來,( -d "$dirname" ) -a ( -x "$dirname" )。但是(是個特殊符合,需使用/(的方式,即為:if [ -n "$dirname" ] &&[ /( -d "$dirname" /) -a /( -x "$dirname" /) ] 。
整數比較
>或者<或者=是用於字串的比較,如果用於整數比較,使用:
-lt,小於 -le,小於等於 -eq,等於 -ge,大於等於 -gt,大於 -ne,不等於相關連結: 我的Linux操作相關文章
相關文章
- Linux Bash Shell學習(十):流程控制——forLinux
- Shell學習【流程控制】
- Shell(Bash)學習· 總章
- Bash流程控制
- Linux Bash Shell學習(八):shell程式設計基礎——string操作Linux程式設計
- shell和bash指令碼命令學習指令碼
- Linux Bash Shell學習(七):shell程式設計基礎——執行Shell指令碼、functionLinux程式設計指令碼Function
- 『忘了再學』Shell流程控制 — 39、特殊流程控制語句
- shell流程控制
- Linux的Bash Shell詳解Linux
- linux自定義shell(bash)命令Linux
- 【java學習】控制執行流程Java
- Java學習之流程控制Java
- Java學習之流程控制練習Java
- 學習bash
- Shell Script(bash)--教學例(轉)
- Linux深入探索04-Bash shellLinux
- Lua流程控制語句if else的使用詳解
- 『忘了再學』Shell流程控制 — 36、for迴圈介紹
- Linux學習(Shell基礎)Linux
- c# 判斷多分支學習if else if elseC#
- 20天學會bash shell script (二)
- 20天會學bash shell script(一)
- 20 天學會bash shell script (三)
- 快速學習Bash
- Linux中bash shell環境變數Linux變數
- 學習Scala IF…ELSE 語句
- 《前端運維》一、Linux基礎--06Shell流程控制前端運維Linux
- Shell指令碼的基本流程控制指令碼
- Linux學習-shell基礎02Linux
- Linux學習之(shell展開)Linux
- linux shell 學習摘記(3)Linux
- linux shell 學習摘記(4)Linux
- linux shell 學習摘記(5)Linux
- linux shell 學習摘記(6)Linux
- linux shell 學習摘記(7)Linux
- linux shell 學習摘記(8)Linux
- linux shell 學習摘記(9)Linux