bash-shell高级编程--条件判断
條件判斷
每一個(gè)完整并且合理的程序語(yǔ)言都具有條件判斷的功能,并且可以根據(jù)條件判斷的結(jié)果做下一步處理,bash中有test命令,有各種中括號(hào)和圓括號(hào)操作,和if/then結(jié)構(gòu)
條件測(cè)試結(jié)構(gòu)
- 使用if/then結(jié)構(gòu)判斷命令列表的退出碼狀態(tài)是否為0,如果成功的話,那么就執(zhí)行接下來(lái)一個(gè)或多個(gè)命令。
- 有一個(gè)專有命令[(左括號(hào),特殊字符),這個(gè)命令與test命令等價(jià),并且處于效率上的考慮,這是一個(gè)內(nèi)建命令,這個(gè)命令把它的參數(shù)作為表達(dá)式或者文件測(cè)試,并且根據(jù)比較的結(jié)果返回一個(gè)退出狀態(tài)碼(0表示真,1表示假)
- 在版本2.02的bash中,引入了[[....]]擴(kuò)展測(cè)試命令,因?yàn)檫@種表現(xiàn)形式可能對(duì)某些語(yǔ)言的程序員來(lái)說(shuō)更熟悉一些,注意[[]]是一個(gè)關(guān)鍵字,并不是一個(gè)命令,并且bash會(huì)將[[ $a -lt $b ]]看成單獨(dú)的元素,并且返回一個(gè)退出狀態(tài)碼。
if命令不僅可以測(cè)試中括號(hào)中的條件,可以測(cè)試任何命令
if cmp a b &> /dev/null # 禁止輸出. then echo "Files a and b are identical." else echo "Files a and b differ." fi# 非常有用的"if-grep"結(jié)構(gòu): # ------------------------ if grep -q Bash file then echo "File contains at least one occurrence of Bash." fiword=Linux letter_sequence=inu if echo "$word" | grep -q "$letter_sequence" # "-q" 選項(xiàng)是用來(lái)禁止輸出的. thenecho "$letter_sequence found in $word" elseecho "$letter_sequence not found in $word" fi## 執(zhí)行成功,進(jìn)到if條件判斷下 if COMMAND_WHOSE_EXIT_STATUS_IS_0_UNLESS_ERROR_OCCURRED then echo "Command succeeded." else echo "Command failed." fi- 一個(gè)if/then結(jié)構(gòu)可以包含嵌套的比較操作和條件判斷操作
什么是真
#!/bin/bash# 小技巧: # 如果你不能夠確定一個(gè)特定的條件該如何進(jìn)行判斷, #+ 那么就使用if-test結(jié)構(gòu). echoecho "Testing \"0\"" if [ 0 ] # zero thenecho "0 is true." elseecho "0 is false." fi # 0 為真. echoecho "Testing \"1\"" if [ 1 ] # one thenecho "1 is true." elseecho "1 is false." fi # 1 為真. echoecho "Testing \"-1\"" if [ -1 ] # 負(fù)1 thenecho "-1 is true." elseecho "-1 is false." fi # -1 為真. echoecho "Testing \"NULL\"" if [ ] # NULL (空狀態(tài)) thenecho "NULL is true." elseecho "NULL is false." fi # NULL 為假. echoecho "Testing \"xyz\"" if [ xyz ] # 字符串 thenecho "Random string is true." elseecho "Random string is false." fi # 隨便的一串字符為真.echoecho "Testing \"\$xyz\"" if [ $xyz ] # 判斷$xyz是否為null, 但是...# 這只是一個(gè)未初始化的變量. thenecho "Uninitialized variable is true." elseecho "Uninitialized variable is false." fi # 未定義的初始化為假.echoecho "Testing \"-n \$xyz\"" if [ -n "$xyz" ] # 更加正規(guī)的條件檢查. thenecho "Uninitialized variable is true." elseecho "Uninitialized variable is false." fi # 未初始化的變量為假.echo xyz= # 初始化了, 但是賦null值.echo "Testing \"-n \$xyz\"" if [ -n "$xyz" ] thenecho "Null variable is true." elseecho "Null variable is false." fi # null變量為假. echo # 什么時(shí)候"false"為真?echo "Testing \"false\"" if [ "false" ] # 看起來(lái)"false"只不過(guò)是一個(gè)字符串而已. thenecho "\"false\" is true." #+ 并且條件判斷的結(jié)果為真. elseecho "\"false\" is false." fi # "false" 為真.echoecho "Testing \"\$false\"" # 再來(lái)一個(gè), 未初始化的變量. if [ "$false" ] thenecho "\"\$false\" is true." elseecho "\"\$false\" is false." fi # "$false" 為假. # 現(xiàn)在, 我們得到了預(yù)期的結(jié)果. # 如果我們測(cè)試以下為初始化的變量"$true"會(huì)發(fā)生什么呢? echo exit 0執(zhí)行結(jié)果
andrew@andrew:/work/bash/src$ bash if_true.sh Testing "0" 0 is true.Testing "1" 1 is true.Testing "-1" -1 is true.Testing "NULL" NULL is false.Testing "xyz" Random string is true.Testing "$xyz" Uninitialized variable is false.Testing "-n $xyz" Uninitialized variable is false.Testing "-n $xyz" Null variable is false.Testing "false" "false" is true.Testing "$false" "$false" is false.如果if和then在條件判斷的同一行上的話,必須使用分號(hào)結(jié)束if表達(dá)式,if和then都是關(guān)鍵字。關(guān)鍵字(或者命令)如果作為表達(dá)式的開(kāi)頭,并且如果想在同一行上再寫(xiě)一個(gè)新的表達(dá)式的話,那么必須使用分號(hào)來(lái)結(jié)束上一句表達(dá)式。
if [ -x "$filename" ]; then
else if 和elif
elif是else if的縮寫(xiě)形式,作用是在外部的判斷結(jié)構(gòu)中在嵌入一個(gè)內(nèi)部的if/then結(jié)構(gòu)
if [ condition1 ] thencommand1command2command3 elif [ condition2 ] # 與else if一樣 thencommand4command5 elsedefault-command fiif test condition結(jié)構(gòu)與if [ condition ]完全相同。
test命令在Bash中是內(nèi)建命令, 用來(lái)測(cè)試文件類型, 或者用來(lái)比較字符串. 因此, 在Bash
腳本中, test命令并不會(huì)調(diào)用外部的 /usr/bin/test 中的test命令, 這是sh-utils工具包中
的一部分. 同樣的, [也并不會(huì)調(diào)用 /usr/bin/[ , 這是 /usr/bin/test 的符號(hào)鏈接.
test、/usr/bin/test, [], 和/usr/bin/[都是等價(jià)的命令
#!/bin/bash echo if test -z "$1" thenecho "No command-line arguments." elseecho "First command-line argument is $1." fi echo if /usr/bin/test -z "$1" # 與內(nèi)建的"test"命令結(jié)果相同. thenecho "No command-line arguments." elseecho "First command-line argument is $1." fi echo if [ -z "$1" ] # 與上邊的代碼塊作用相同. # if [ -z "$1" 應(yīng)該能夠運(yùn)行, 但是... #+ Bash報(bào)錯(cuò), 提示缺少關(guān)閉條件測(cè)試的右中括號(hào). thenecho "No command-line arguments." elseecho "First command-line argument is $1." fi echo if /usr/bin/[ -z "$1" ] # 再來(lái)一個(gè), 與上邊的代碼塊作用相同. # if /usr/bin/[ -z "$1" # 能夠工作, 但是還是給出一個(gè)錯(cuò)誤消息. # # 注意: #在版本3.x的Bash中, 這個(gè)bug已經(jīng)被修正了. thenecho "No command-line arguments." elseecho "First command-line argument is $1." fi echo exit 0在[[]]之間的所有的字符都不會(huì)發(fā)生文件名擴(kuò)展或者單詞分割,但是會(huì)發(fā)生參數(shù)擴(kuò)展和命令替換
使用[[]]而不是[],能夠防止腳本中的許多邏輯錯(cuò)誤,比如, &&,||, < , 和>操作符能夠正常存在于[[]]條件判斷結(jié)構(gòu)中,但是如果出現(xiàn)在[]結(jié)構(gòu)中的話,會(huì)報(bào)錯(cuò)。
if后面也不一定得跟test命令或者用于條件判斷的中括號(hào)([]或者[[]])
dir=/home/bozoif cd "$dir" 2>/dev/null; then # "2>/dev/null" 會(huì)隱藏錯(cuò)誤信息.echo "Now in $dir." elseecho "Can't change to $dir." fiif command結(jié)構(gòu)將會(huì)返回command的退出碼。
在中括號(hào)中的條件判斷也不是非if不可,也可以使用列表結(jié)構(gòu)
var1=20 var2=22 [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"home=/home/bozo [ -d "$home" ] || echo "$home directory does not exist."算術(shù)測(cè)試使用(())
#!/bin/bash # 算術(shù)測(cè)試. # (( ... ))結(jié)構(gòu)可以用來(lái)計(jì)算并測(cè)試算術(shù)表達(dá)式的結(jié)果. # 退出狀態(tài)將會(huì)與[ ... ]結(jié)構(gòu)完全相反! (( 0 )) echo "Exit status of \"(( 0 ))\" is $?."(( 1 ))echo "Exit status of \"(( 1 ))\" is $?." (( 5 > 4 )) echo "Exit status of \"(( 5 > 4 ))\" is $?." (( 5 > 9 )) echo "Exit status of \"(( 5 > 9 ))\" is $?." (( 5 - 5 )) echo "Exit status of \"(( 5 - 5 ))\" is $?." (( 5 / 4 )) echo "Exit status of \"(( 5 / 4 ))\" is $?." (( 1 / 2 )) echo "Exit status of \"(( 1 / 2 ))\" is $?." (( 1 / 0 )) 2>/dev/null # echo "Exit status of \"(( 1 / 0 ))\" is $?." # "2>/dev/null"起了什么作用? # 如果這句被刪除會(huì)怎樣? # 嘗試刪除這句, 然后在運(yùn)行這個(gè)腳本. exit 0條件測(cè)試操作符
條件成立返回真,調(diào)試不成立時(shí)返回假
-e
文件存在
-a
文件存在
這個(gè)選項(xiàng)的效果與-e相同. 但是它已經(jīng)被"棄用"了, 并且不鼓勵(lì)使用.
-f
表示這個(gè)文件是一個(gè) 一般 文件(并不是目錄或者設(shè)備文件)
-s
文件大小不為零
-d
表示這是一個(gè)目錄
-b
表示這是一個(gè)塊設(shè)備(軟盤(pán), 光驅(qū), 等等.)
-c
表示這是一個(gè)字符設(shè)備(鍵盤(pán), modem, 聲卡, 等等.)
-p
這個(gè)文件是一個(gè)管道
-h
這是一個(gè)符號(hào)鏈接
-L
這是一個(gè)符號(hào)鏈接
-S
表示這是一個(gè)socket
-t
文件(描述符)被關(guān)聯(lián)到一個(gè)終端設(shè)備上
這個(gè)測(cè)試選項(xiàng)一般被用來(lái)檢測(cè)腳本中的 stdin ( [終端.-t 0 ] )或者 stdout ( [``-t 1 ] )是否來(lái)自于一個(gè)
-r
文件是否具有可讀權(quán)限( 指的是正在運(yùn)行這個(gè)測(cè)試命令的用戶是否具有讀權(quán)限)
-w
文件是否具有可寫(xiě)權(quán)限(指的是正在運(yùn)行這個(gè)測(cè)試命令的用戶是否具有寫(xiě)權(quán)限)
-x
文件是否具有可執(zhí)行權(quán)限(指的是正在運(yùn)行這個(gè)測(cè)試命令的用戶是否具有可執(zhí)行權(quán)限)
-g
set-group-id(sgid)標(biāo)記被設(shè)置到文件或目錄上
如果目錄具有 sgid 標(biāo)記的話, 那么在這個(gè)目錄下所創(chuàng)建的文件將屬于擁有這個(gè)目錄的用戶組, 而
不必是創(chuàng)建這個(gè)文件的用戶組. 這個(gè)特性對(duì)于在一個(gè)工作組中共享目錄非常有用.
-u
set-user-id (suid)標(biāo)記被設(shè)置到文件上,如果一個(gè)root用戶所擁有的二進(jìn)制可執(zhí)行文件設(shè)置了 set-user-id 標(biāo)記位的話, 那么普通用戶也會(huì)以root權(quán)限來(lái)運(yùn)行這個(gè)文件. 這對(duì)于需要訪問(wèn)系統(tǒng)硬件的執(zhí)行程序(比如pppd和cdrecord)非
常有用. 如果沒(méi)有suid標(biāo)志的話, 這些二進(jìn)制執(zhí)行程序是不能夠被非root用戶調(diào)用的.
對(duì)于設(shè)置了 suid 標(biāo)志的文件, 在它的權(quán)限列中將會(huì)以s 表示.
-k
設(shè)置 粘貼位
對(duì)于"粘貼位"的一般了解, save-text-mode標(biāo)志是一個(gè)文件權(quán)限的特殊類型. 如果文件設(shè)置了這個(gè)標(biāo)志, 那么這個(gè)文件將會(huì)被保存到緩存中, 這樣可以提高訪問(wèn)速度. 粘貼位如果設(shè)置在目錄中, 那么它將限制寫(xiě)權(quán)限. 對(duì)于設(shè)置了粘貼位的文件或目錄, 在它們的權(quán)限標(biāo)記列中將會(huì)顯示 t.
drwxrwxrwt 7 root 1024 May 19 21:26 tmp/
如果用戶并不擁有這個(gè)設(shè)置了粘貼位的目錄, 但是他在這個(gè)目錄下具有寫(xiě)權(quán)限, 那么這個(gè)用戶只能在這個(gè)目錄下刪除自己所擁有的文件. 這將有效的防止用戶在一個(gè)公共目錄中不慎覆蓋或者刪除別人的文件. 比如說(shuō) /tmp 目錄. (當(dāng)然, 目錄的所有者或者 root用戶可以隨意刪除或重命名其中的文件.)
-O
判斷你是否是文件的擁有者
-G
文件的group-id是否與你的相同
-N
從文件上一次被讀取到現(xiàn)在為止, 文件是否被修改過(guò)
f1 -nt f2
文件 f1 比文件 f2 新
f1 -ot f2
文件 f1 比文件 f2 舊
f1 -ef f2文件 f1 和文件 f2 是相同文件的硬鏈接
!
“非” – 反轉(zhuǎn)上邊所有測(cè)試的結(jié)果(如果沒(méi)給出條件, 那么返回真).
測(cè)試斷掉的鏈接文件
#!/bin/bash # 一個(gè)可以測(cè)試鏈接斷掉的符號(hào)鏈接的文件,并且可以輸出它們指向的文件 # 以便于它們可以把輸出提供給xargs來(lái)進(jìn)行處理 :) # 比如. broken-link.sh /somedir /someotherdir|xargs rm # #下邊的方法, 不管怎么說(shuō), 都是一種更好的辦法: # #find "somedir" -type l -print0|\ #xargs -r0 file|\ #grep "broken symbolic"| #sed -e 's/^\|: *broken symbolic.*$/"/g' # #但這不是一個(gè)純粹的bash腳本, 最起碼現(xiàn)在不是. #注意: 謹(jǐn)防在/proc文件系統(tǒng)和任何死循環(huán)鏈接中使用! ############################################################## #如果沒(méi)有參數(shù)被傳遞到腳本中, 那么就使用 #當(dāng)前目錄. 否則就是用傳遞進(jìn)來(lái)的參數(shù)作為目錄 #來(lái)搜索. #################### [ $# -eq 0 ] && directorys=`pwd` || directorys=$@#編寫(xiě)函數(shù)linkchk用來(lái)檢查傳遞進(jìn)來(lái)的目錄或文件是否是鏈接, #并判斷這些文件或目錄是否存在. 然后打印它們所指向的文件. #如果傳遞進(jìn)來(lái)的元素包含子目錄, #那么把子目錄也放到linkcheck函數(shù)中處理, 這樣就達(dá)到了遞歸的目的. ########## # 如果是軟連接,則輸出,如果是目錄就進(jìn)行地遞歸 linkchk () {for element in $1/*; do[ -h "$element" -a ! -e "$element" ] && echo \"$element\"[ -d "$element" ] && linkchk $element# 當(dāng)然, '-h'用來(lái)測(cè)試符號(hào)鏈接, '-d'用來(lái)測(cè)試目錄.done } # 把每個(gè)傳遞到腳本的參數(shù)都送到linkchk函數(shù)中進(jìn)行處理, # 檢查是否有可用目錄. 如果沒(méi)有, 那么就打印錯(cuò)誤消息和 # 使用信息. ################ for directory in $directorys; doif [ -d $directory ]then linkchk $directoryelseecho "$directory is not a directory"echo "Usage: $0 dir1 dir2 ..."fidone exit 0 # 創(chuàng)建一個(gè)新文件 name andrew@andrew:/work/bash/src$ touch name # 為name創(chuàng)建符號(hào)鏈接 andrew@andrew:/work/bash/src$ ln -s name aaa # 刪除name文件, aaa將會(huì)變成丟失鏈接文件的符號(hào)鏈接 andrew@andrew:/work/bash/src$ rm name # 查看aaa為執(zhí)行當(dāng)前目錄下的name的符號(hào)鏈接文件 andrew@andrew:/work/bash/src$ ls -l 總用量 44 lrwxrwxrwx 1 andrew andrew 4 2月 1 13:20 aaa -> name -rwxrwxr-x 1 andrew andrew 8656 1月 30 14:46 a.out -rw-rw-r-- 1 andrew andrew 1887 2月 1 13:08 broken_link.sh -rw-rw-r-- 1 andrew andrew 322 1月 29 13:08 echo_unique.sh -rw-rw-r-- 1 andrew andrew 1513 1月 29 15:55 escape_charater.sh -rw-rw-r-- 1 andrew andrew 279 1月 30 13:48 exit_example.sh -rw-rw-r-- 1 andrew andrew 199 2月 1 11:52 if_else_more.sh -rw-rw-r-- 1 andrew andrew 1946 1月 30 21:03 if_true.sh -rw-rw-r-- 1 andrew andrew 337 1月 29 14:02 single_quotation_mark.sh -rw-rw-r-- 1 andrew andrew 864 2月 1 12:00 test.c # 調(diào)用腳本清除當(dāng)前文件夾中,丟失鏈接文件的符號(hào)鏈接 andrew@andrew:/work/bash/src$ bash broken_link.sh ./ | xargs rm andrew@andrew:/work/bash/src$ ls -l 總用量 44 -rwxrwxr-x 1 andrew andrew 8656 1月 30 14:46 a.out -rw-rw-r-- 1 andrew andrew 1887 2月 1 13:08 broken_link.sh -rw-rw-r-- 1 andrew andrew 322 1月 29 13:08 echo_unique.sh -rw-rw-r-- 1 andrew andrew 1513 1月 29 15:55 escape_charater.sh -rw-rw-r-- 1 andrew andrew 279 1月 30 13:48 exit_example.sh -rw-rw-r-- 1 andrew andrew 199 2月 1 11:52 if_else_more.sh -rw-rw-r-- 1 andrew andrew 1946 1月 30 21:03 if_true.sh -rw-rw-r-- 1 andrew andrew 337 1月 29 14:02 single_quotation_mark.sh -rw-rw-r-- 1 andrew andrew 864 2月 1 12:00 test.c- 在將suid標(biāo)記設(shè)置到二進(jìn)制可執(zhí)行文件的時(shí)候, 一定要小心. 因?yàn)檫@可能會(huì)引發(fā)安全漏洞.
但是suid標(biāo)記不會(huì)影響shell腳本. - 在當(dāng)代UNIX系統(tǒng)中, 文件中已經(jīng)不使用粘貼位了, 粘貼位只使用在目錄中.
其他比較操作符
二元比較操作符,用來(lái)比較兩個(gè)變量或者數(shù)字。
整數(shù)比較
-eq
等于
if [ "$a" -eq "$b" ]
-ne
不等于
if [ "$a" -ne "$b" ]
-gt
大于
if [ “a"?gt"a" -gt "a"?gt"b” ]
-ge
大于等于
if [ "$a" -ge "$b" ]
-lt
小于
if [ "$a" -lt "$b" ]
-le
小于等于
if [ "$a" -le "$b" ]
<
小于(在雙括號(hào)中使用)
(("$a" < "$b"))
<=
小于等于(在雙括號(hào)中使用)
(("$a" <= "$b"))
>
大于(在雙括號(hào)中使用)
(("$a" > "$b"))
>=
大于等于(在雙括號(hào)中使用)
下一頁(yè)
(("$a" >= "$b"))
字符串比較
=
等于
if [ "$a" = "$b" ]
==
等于
if [ "$a" == "$b" ]
與=等價(jià).
==比較操作符在雙中括號(hào)對(duì)和單中括號(hào)對(duì)中的行為是不同的.
!=
不等號(hào)
if [ "$a" != "$b" ]
這個(gè)操作符將在[[ … ]]結(jié)構(gòu)中使用模式匹配.
<
小于, 按照ASCII字符進(jìn)行排序
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意"<"使用在 [ ] 結(jié)構(gòu)中的時(shí)候需要被轉(zhuǎn)義.
>
大于, 按照ASCII字符進(jìn)行排序
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意">"使用在 [ ] 結(jié)構(gòu)中的時(shí)候需要被轉(zhuǎn)義.
-z
字符串為"null", 意思就是字符串長(zhǎng)度為零
-n
字符串不為"null".
檢查字符串是否為NULL
該腳本只在ubuntu 16.04上測(cè)試過(guò),在其他系統(tǒng)上使用記得先使用shellcheck對(duì)腳本進(jìn)行語(yǔ)法檢查
#!/bin/bash # str-test.sh: 檢查null字符串和未引用的字符串, #+ but not strings and sealing wax, not to mention cabbages and kings . . . #+ 但不是字符串和封蠟, 也并沒(méi)有提到卷心菜和國(guó)王. . . ??? (沒(méi)看懂, rojy bug)# 使用 if [ ... ]# 如果字符串并沒(méi)有被初始化, 那么它里面的值未定義. # 這種狀態(tài)被稱為"null" (注意這與零值不同).if [ -n $string1 ] # $string1 沒(méi)有被聲明和初始化.thenecho "String \"string1\" is not null."elseecho "String \"string1\" is null." fi # 錯(cuò)誤的結(jié)果. # 顯示$string1為非null, 雖然這個(gè)變量并沒(méi)有被初始化.echo# 讓我們?cè)僭囈幌?if [ -n "$string1" ] # 這次$string1被引號(hào)擴(kuò)起來(lái)了. thenecho "String \"string1\" is not null." elseecho "String \"string1\" is null." fi # 注意一定要將引用的字符放到中括號(hào)結(jié)構(gòu)中!33 echoif [ $string1 ] # 這次, 就一個(gè)$string1, 什么都不加. thenecho "String \"string1\" is not null." elseecho "String \"string1\" is null." fi # 這種情況運(yùn)行的非常好. # [ ] 測(cè)試操作符能夠獨(dú)立檢查string是否為null. # 然而, 使用("$string1")是一種非常好的習(xí)慣. # # 就像Stephane Chazelas所指出的, #if [ $string1 ]只有一個(gè)參數(shù), "]" #if [ "$string1" ] 有兩個(gè)參數(shù), 一個(gè)是空的"$string1", 另一個(gè)是"]"echo string1=initializedif [ $string1 ] # 再來(lái), 還是只有$string1, 什么都不加. thenecho "String \"string1\" is not null." elseecho "String \"string1\" is null." fi # 再來(lái)試一下, 給出了正確的結(jié)果. # 再?gòu)?qiáng)調(diào)一下, 使用引用的("$string1")還是更好一些, 原因我們上邊已經(jīng)說(shuō)過(guò)了.string1="a = b"if [ $string1 ] # 再來(lái), 還是只有$string1, 什么都不加. thenecho "String \"string1\" is not null." elseecho "String \"string1\" is null." fi # 未引用的"$string1", 這回給出了錯(cuò)誤的結(jié)果!exit 0執(zhí)行結(jié)果
andrew@andrew:/work/bash/src$ bash str_test.sh String "string1" is not null.String "string1" is null.String "string1" is null.String "string1" is not null. String "string1" is null. #!/bin/bash # zmore#使用'more'來(lái)查看gzip文件NOARGS=65 NOTFOUND=66 NOTGZIP=67if [ $# -eq 0 ] # 與if [ -z "$1" ]效果相同 # (譯者注: 上邊這句注釋有問(wèn)題), $1是可以存在的, 可以為空, 如: zmore "" arg2 arg3thenecho "Usage: `basename $0` filename" >&2 # 錯(cuò)誤消息輸出到stderr.exit $NOARGS # 返回65作為腳本的退出狀態(tài)的值(錯(cuò)誤碼). fifilename=$1if [ ! -f "$filename" ] # 將$filename引用起來(lái), 這樣允許其中包含空白字符. thenecho "File $filename not found!" >&2 # 錯(cuò)誤消息輸出到stderr. exit $NOTFOUND fiif [ ${filename##*.} != "gz" ] # 在變量替換中使用中括號(hào)結(jié)構(gòu). then31 echo "File $1 is not a gzipped file!"exit $NOTGZIP fizcat $1 | more# 使用過(guò)濾命令'more.' # 當(dāng)然, 如果你愿意, 也可以使用'less'. exit $? # 腳本將把管道的退出狀態(tài)作為返回值. # 事實(shí)上, 也不一定非要加上"exit $?", 因?yàn)樵谌魏吻闆r下, # 腳本都會(huì)將最后一條命令的退出狀態(tài)作為返回值.-a
邏輯與exp1 -a exp2, 如果表達(dá)式exp1和exp2都為真的話, 那么結(jié)果為真.
-o
邏輯或exp1 -o exp2, 如果表達(dá)式exp1和exp2中至少有一個(gè)為真的話, 那么結(jié)果為真.
嵌套的if/then條件測(cè)試
可以通過(guò)if/then結(jié)構(gòu)來(lái)使用嵌套的條件測(cè)試,最終的結(jié)果和上面使用的&&混合比較操作符的結(jié)果是相同的。
if [ condition1 ] thenif [ condition2 ]thendo-something # But only if both "condition1" and "condition2" valid.fi fi檢測(cè)你對(duì)測(cè)試知識(shí)的掌握
if [ -f $HOME/.Xclients ]; thenexec $HOME/.Xclients elif [ -f /etc/X11/xinit/Xclients ]; thenexec /etc/X11/xinit/Xclients else# 失敗后的安全設(shè)置. 雖然我們永遠(yuǎn)都不會(huì)走到這來(lái).# (我們?cè)赬clients中也提供了相同的機(jī)制) 保證它不會(huì)被破壞.xclock -geometry 100x100-5+5 &xterm -geometry 80x50-50+150 &if [ -f /usr/bin/netscape -a -f /usr/share/doc/HTML/index.html ]; thennetscape /usr/share/doc/HTML/index.html & fi fi總結(jié)
以上是生活随笔為你收集整理的bash-shell高级编程--条件判断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于密度的停留点识别方法
- 下一篇: bash-shell--高级编程