为什么 ZSH 参数扩展标志不适用于此处字符串?

为什么 ZSH 参数扩展标志不适用于此处字符串?

参数扩展标志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}}

请参阅扩张规则了解详情。

相关内容