Shell-Script

殼牌:為什麼-n’$VAR-‘−n’$在一種R−’-n ‘${VAR-}‘代替-n’$V一個__−n’$在一種R’-n ‘$VAR’?

  • June 15, 2017

我看到很多 shell 腳本(例如,這個)檢查變數的存在/不存在,例如:

[ -n "${VAR-}" ]

據我所知,在檢查變數存在/不存在(或)時,使用${VAR-fallback}不提供 a 的表單沒有任何意義。也是如此。例如,對於未設置的變數,fallback``-n``-z``${VAR:-fallback}

unset VAR
[ -z "$VAR" ]       &&
 [ -z "${VAR-}" ]  &&
 [ -z "${VAR:-}" ] &&
 echo True        # => True

並帶有一個空變數

VAR=
[ -z "$VAR" ]       &&
 [ -z "${VAR-}" ]  &&
 [ -z "${VAR:-}" ] &&
 echo True        # => True

但我在足夠多的地方看到它,我不得不問,我錯過了什麼嗎?只是誤會導致誤用,還是真的有這樣做的理由?

如果set -u有效VAR且未設置,[ -z "$VAR" ]將導致錯誤。使用[ -z "${VAR-}" ]預設值覆蓋使用未設置變數的檢查,並且沒有錯誤。

你是絕對正確的 - 沒有理由使用表單${VAR:-}或表單${VAR-}test -nor test -z

我自己沒有見過這個,所以我只能猜測沒有經驗的 shell 程序員可能認為unset值和值之間在test -n工作方式方面存在一些差異,但這只有在test(ie [) 都是內置的情況下才會發生 -在, 和越野車; 或者如果有人試圖使用set -u而沒有考慮以這種方式防禦它的含義。

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