Zsh

測試命令和被包圍的單個條件表達式有什麼區別[[[]?

  • July 30, 2020

我正在學習條件表達式部分的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!
  1. 為什麼無論是 with還是option , testwith a總是給出真實的結果?命令和由 包圍的單個條件表達式有什麼區別?var_assigned_with_emptystring``-n``-z``test``[[]]
  2. ""和 和有什麼不一樣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" ]]是等價的。

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