Shell-Script

bash - 如果字元串的長度為(非)零,則為真?

  • June 3, 2018
# touch $$
# gzip $$
# gzip --test $$.gz
# echo $?
0
# OUT=$(gzip --test $$.gz)
# echo $OUT

# if [ -z $OUT ] ; then echo $$ ; fi
26521
# if [ -n $OUT ] ; then echo $$ ; fi
26521
# 

bash(1)

   -z string
          True if the length of string is zero.
   string
   -n string
          True if the length of string is non-zero.

我很困惑,它如何同時為零非零?如何檢查鍵是否有值(使用bash)?

[ .. ]遵循與所有其他命令相同的規則,即應用分。如果OUT為空(或未設置),$OUT將擴展為空,甚至不是空參數。

因此,[ -n $OUT ]擴展為[,-n], 並[測試是否-n不是空字元串。是的,所以測試返回 true。

您需要引用$OUT,就像幾乎在其他任何地方一樣:

if [ -n "$OUT" ]; then ...

請參閱:何時需要雙引號? 以及BashGuide 上的測試和條件

命令

[ -z $OUT ]

完全等同於

test -z $OUT

其中,如果$OUT為空,則與

test -z

的行為test 取決於命令行中給出的參數數量。如果僅給定一個參數,如test -nor test -z,如果該參數的長度在解釋為字元串時為非零,則結果將為“真”。

這意味著 if$OUT為空且未加引號,則test -z $OUTtest -n $OUT都為真,因為-z-n都是非零長度的字元串。

為了解決這個問題,雙引號變數擴展:

[ -n "$OUT" ]

也可以看看

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