Caleb Asked: 2022-03-18 09:56:12 +0800 CST2022-03-18 09:56:12 +0800 CST 2022-03-18 09:56:12 +0800 CST 为什么 ZSH 参数扩展标志不适用于此处的字符串? 772 u参数扩展标志应该只输出唯一的数组值。它确实......有时。 $ stuff=(a b a c) $ echo ${(u)stuff} a b c $ cat <<< ${(u)stuff} a b a c 是什么赋予了? zsh 1 个回答 Voted Best Answer Stéphane Chazelas 2022-03-18T10:27:32+08:002022-03-18T10:27:32+08:00 在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}} 有关详细信息,请参阅扩展规则。
在
echo ${(u)stuff}
,echo
中传递了数组的 3 个唯一元素(省略了空元素)。您在列表上下文中,用于简单命令的参数。但是在
<<<
它是一个非列表上下文之后,cat
只有一个标准输入,<<<
只需要一个东西存储在将组成标准输入的临时文件中cat
,因此数组的元素与第一个字符连接$IFS
。与中相同:所有只需要一个参数并且更多的情况都是没有意义的。
在这里,这样做就足够了:
u
首先应用标志并在外部级别进行连接。同样在:
但是,您需要:
强制内部扩展的列表上下文,并在外部扩展中执行 IFS 连接,以便将一个参数传递给
printf
.$IFS
您可能希望显式指定数组元素应如何连接,而不是依赖于全局参数,例如:有关详细信息,请参阅扩展规则。