Zsh

為什麼 ZSH 參數擴展標誌不適用於此處的字元串?

  • March 18, 2022

u參數擴展標誌應該只輸出唯一的數組值。它確實……有時。

$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c

是什麼賦予了?

echo ${(u)stuff},echo中傳遞了數組的 3 個唯一元素(省略了空元素)。您在列表上下文中,用於簡單命令的參數。

$ printf '"%s"\n' ${(u)stuff}
"a"
"b"
"c"

但是在<<<它是一個非列表上下文之後,cat只有一個標準輸入,<<<只需要一個東西儲存在將組成標準輸入的臨時文件中cat,因此數組的元素與第一個字元連接$IFS。與中相同:

echo "$stuff"
scalar=$stuff
[[ $stuff = x ]]
case $stuff... in
...

所有隻需要一個參數並且更多的情況都是沒有意義的。

在這裡,這樣做就足夠了:

cat <<< ${${(u)stuff}}

u首先應用標誌並在外部級別進行連接。

同樣在:

scalar=${${(u)stuff}}

但是,您需要:

$ printf '"%s"\n' "${${(@u)stuff}}"
"a b c"

強制內部擴展的列表上下文,並在外部擴展中執行 IFS 連接,以便將一個參數傳遞給printf.

$IFS您可能希望顯式指定數組元素應如何連接,而不是依賴於全域參數,例如:

printf '"%s"\n' ${(j[ ])${(u)stuff}}
cat <<< ${(j[ ])${(u)stuff}}

有關詳細資訊,請參閱擴展規則

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