Shell

在 shell 腳本中測試變數是否為空

  • December 24, 2016

我已經看到在許多不同的 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 $1is empty**的正確方法,並且[ "$x" = "$y" ]是測試兩個變數是否相等的正確方法。

甚至一些目前的 shell 可能會與較長的表達式混淆,並且一些表達式實際上是模棱兩可的,因此避免使用-aand-o運算符來構造較長的布爾測試,而是使用單獨的呼叫[和 shell 自己的&&||布爾運算符。

引用自:https://unix.stackexchange.com/questions/32180