Zsh
測試命令和被包圍的單個條件表達式有什麼區別[[[]?
我正在學習條件表達式部分的zsh,我發現了一些不合理的輸出。
例如:
$ mkdir emptyspace && cd emptyspace $ var_assigned_with_emptystring="" $ [[ -n $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a nonzero-len string!' $ [[ -n "" ]] && echo '"" is a nonzero-len string!' $ test -n $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a nonzero-len string by test!' var_assigned_with_emptystring is a nonzero-len string by test! $ test -n "" && echo '"" is a nonzero-len string by test!' ---------- $ [[ -z $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a zero-len string!' var_assigned_with_emptystring is not an empty string! $ [[ -z "" ]] && echo '"" is a zero-len string!' "" is a zero-len string! $ test -z $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a zero-len string by test!' var_assigned_with_emptystring is a zero-len string by test! $ test -z "" && echo '"" is a zero-len string by test!' "" is a zero-len string by test!
- 為什麼無論是 with還是option ,
test
with a總是給出真實的結果?命令和由 包圍的單個條件表達式有什麼區別?var_assigned_with_emptystring``-n``-z``test``[[]]
""
和 和有什麼不一樣var_assigned_with_emptystring
?我認為參數應該被擴展(或評估)到與""
測試函式內部處理時相同的值。但是test -n $var_assigned_with_emptystring
給出了不同的返回狀態test -n ""
這主要在[為什麼不帶引號的帶空格的參數擴展在雙括號“[[”內有效,但在單括號“”內無效?. 簡而言之,
[[ … ]]
是具有不同解析規則的特殊語法,而test
和[
是普通命令。簡而言之
sh
(包括ksh
,bash
等),由於缺少雙引號,因此對test -n $var
的值應用拆分和萬用字元。var
這不會發生在雙括號內。
zsh
扭曲的是,大多數情況下zsh
變數擴展不需要雙引號。$var
但是,列表上下文(例如命令行)之間存在一個區別"$var"
:如果一個單詞為空且不包含任何引號,zsh
則將其刪除。因此,當 的值為var
空時,是帶有一個參數test -n $var
的命令,並且帶有一個非空參數的命令為“真”。但是是帶有兩個參數和一個空字元串的命令,它將測試應用於空字元串,即“假”。test``-n``test``test -n "$var"``test``-n``-n
在內部
[[ … ]]
,空詞刪除不會發生,因此[[ -n $var ]]
和[[ -n "$var" ]]
是等價的。