参数扩展标志u
应该只输出唯一的数组值。有时确实如此。
$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c
是什么赋予了?
答案1
在 中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}}
请参阅扩张规则了解详情。