Shell-Script
殼牌:為什麼-n’$VAR-‘−n’$在一種R−’-n ‘${VAR-}‘代替-n’$V一個__−n’$在一種R’-n ‘$VAR’?
我看到很多 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 -n
ortest -z
。我自己沒有見過這個,所以我只能猜測沒有經驗的 shell 程序員可能認為unset值和空值之間在
test -n
工作方式方面存在一些差異,但這只有在test
(ie[
) 都是內置的情況下才會發生 -在, 和越野車; 或者如果有人試圖使用set -u
而沒有考慮以這種方式防禦它的含義。