Shell
在 shell 腳本中測試變數是否為空
我已經看到在許多不同的 shell 上多次使用以下技術來測試變數是否為空:
if [ "x$1" = "x" ]; then # Variable is empty fi
與更規範的相比,使用它有什麼優勢
if [ -z "$1" ]
嗎?會不會是便攜性問題?
[ -n = "" ]
一些歷史上的 shell 實現了一個非常簡單的解析器,它可能會被諸如第一個操作數看起來像運算符之類的東西混淆=
,並將其解析為[ -n = ]
或導致語法錯誤。在[ "x$1" = x"" ]
中,x
前綴確保x"$1"
不可能看起來像一個運算符,因此 shell 可以解析此測試的唯一方法是將=
其視為二元運算符。所有現代 shell,甚至大多數仍在執行的舊 shell,都遵循POSIX 規則,該規則要求正確解析最多 4 個單詞的所有測試表達式。所以**
[ -z "$1" ]
是測試 if$1
is empty**的正確方法,並且[ "$x" = "$y" ]
是測試兩個變數是否相等的正確方法。甚至一些目前的 shell 可能會與較長的表達式混淆,並且一些表達式實際上是模棱兩可的,因此避免使用
-a
and-o
運算符來構造較長的布爾測試,而是使用單獨的呼叫[
和 shell 自己的&&
和||
布爾運算符。