Shell 指令碼中中括號「 」判斷問題

2021-07-11 21:01:58 字數 1535 閱讀 7976

在用「」測試的時候,由於不知道什麼原因,判斷的結果總為真。

例如:

[ "$choice"=="n" -o "$choice"=="n" ] && echo

-e"oh interrupt!" && exit

0

無論變數「choice」是什麼內容,測試總為然後輸出後面的內容。

然後查閱資料,發現原因。

在bash的語法中使用中括號作為shell的判斷式時,中括號的兩端必須要有空格符來分隔,並且在中括號內的每個元件都需要有空格鍵來分隔。

所以正確的寫法應該是

[ "$choice" == "n" -o "$choice" == "n" ] && echo

-e"oh interrupt!" && exit

0

即「==」兩邊要加上空格符號,這樣子就能夠判斷正確了。

同樣,在「[[ exp ]]」判斷中,元件之間也要加上空格來分隔,才能夠取得正確結果。

shell中的「」判斷與test的使用方法幾乎一模一樣。if/test結構中的左中括號是呼叫test的命令標識,右中括號是關閉條件判斷的。這個命令把它的引數作為比較表示式或者作為檔案測試,並且根據比較的結果來返回乙個退出狀態碼。

test和中可用的比較運算子只有==和!=,兩者都是用於字串比較的,不可用於整數比較,整數比較只能使用-eq,-gt這種形式。無論是字串比較還是整數比較都不支援大於號小於號。如果實在想用,對於字串比較可以使用轉義形式,如果比較」ab」和」bc」:[ ab \< bc ],結果為真,也就是返回狀態為0。[ ]中的邏輯與和邏輯或使用-a 和-o 表示。「&&」與「||」都是無法使用的。

在中括號判斷中的常量都最好使用單引號或者雙引號括起來,而變數最好使用雙引號括起來。

中括號「」判斷時「==」與「=」的結果是一樣的,如

[ "$choice" == "n" -o "$choice" == "n" ]

[ "$choice" = "n" -o "$choice" = "n" ]
結果相同。

[[是 bash 程式語言的關鍵字。並不是乙個命令,[[ ]] 結構比[ ]結構更加通用。在[[和]]之間所有的字元都不會發生檔名擴充套件或者單詞分割,但是會發生引數擴充套件和命令替換。

支援字串的模式匹配,使用=~操作符時甚至支援shell的正規表示式。字串比較時可以把右邊的作為乙個模式,而不僅僅是乙個字串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字串或萬用字元,不需要引號。

使用[[ … ]]條件判斷結構,而不是[ … ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、《和》 操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。

bash把雙中括號中的表示式看作乙個單獨的元素,並返回乙個退出狀態碼。

《鳥哥的linux私房菜》第三版

shell中的括號(小括號,中括號,大括號)

shell指令碼中的各種括號

shell程式設計中的括號大致有五種,分別是 接下來簡單的介紹以下它們的用法 var 100 var 101 echo var var 404 echo not found 如果var是404,輸出not found var 404if var eq 404 和下面一樣意思一樣 if test va...

shell指令碼中的 if 判斷總結

shell指令碼中的 if 判斷總結 if command then 符合該條件執行的語句 elif command then 符合該條件執行的語句 else 符合該條件執行的語句 fi d dir 如果dir存在並且是乙個目錄則為真 f file 如果file存在且是乙個普通檔案則為真 e dir...

Shell指令碼中的邏輯判斷

1.格式1 if 條件 then 語句 fi ok root localhost if a 3 如果a大於3 then echo ok 輸出ok fiok root localhost if a 3 then echo ok fi ok root localhost shell vi if01.sh...