Zsh
為什麼 ZSH 參數擴展標誌不適用於此處的字元串?
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}}
有關詳細資訊,請參閱擴展規則。