Shell-Script

殼牌:只有雙引號測試-n/-z?

  • January 2, 2019

例如test -e

VAR="<this is a file path: /path/to/file/or/dir"
test -e $VAR && do_something || do_anotherthing

問題:我應該"$VAR"在這裡使用嗎?,如果沒有必要,我不喜歡冗長,因為$VAR顯然在這種情況下是一個路徑,那麼如果它是空字元串,它應該總是失敗,因為沒有空字元串的路徑,然後按照我的邏輯,雙引號是沒有必要的。

但它是字元串測試的情況,例如 test -n:

VAR="<this is a string"
test -n $VAR && do_something || do_anotherthing

然後按照我的邏輯,$VAR應該放在雙引號中:"$VAR"因為它可以擴展為空字元串,如果不在雙引號中,則將僅擴展為-n參數並且始終為真。

所以實際的問題是因為我懷疑我們是否應該在測試命令中只使用雙引號-n-z字元串?

一般規則是對任何變數進行雙引號,除非您希望 shell 對其內容執行標記拆分和萬用字元擴展。

因為$VAR顯然在這種情況下是一條路徑,那麼如果它是空字元串,它應該總是失敗

$$ … $$然後按照我的邏輯,雙引號是沒有必要的。

恰恰相反。沒有操作數的行為test -e是在這種特殊情況下應該引用變數的另一個原因:

$ unset foo      # or foo=""
$ test -e $foo   # note this is equivalent to `test -e'
$ echo $?
0
$ test -e "$foo"
$ echo $?
1
$

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