for循环中的Zsh字符串数组

Zsh array of strings in for loop

我正在尝试在脚本中(在 zsh 中)打印一堆字符串,但它似乎不起作用。如果我将数组放在一个变量中并改为使用它,该代码将起作用。知道为什么这不起作用吗?

for string in (some random strings to print) ; echo $string

勾选 zsh forloop documentation:

for x (1 2 3);  do echo $x; done
for x in 1 2 3; do echo $x; done

您可能正在尝试这样做:

for string in some random strings to print ;do
   echo $string
done

zshfor 命令的默认形式不使用括号(如果有的话,它们不会被解释为 for 的一部分声明):

for string in some random strings to show
do
    echo _$string
done

这导致以下输出:

_some
_random
_strings
_to
_show

因此,对于 in 之后的每个单词,echo _$string 是 运行。列表以换行符结尾。

可以将整个语句写在一行中:

for string in some random strings to show; do echo _$string; done

像往常一样,将多个 shell 命令放在同一行时,只需将换行符替换为 ;。这里的例外是 do 之后的换行符;虽然 zsh 允许 ; 放在 do 之后,但通常不会这样做,在 bash 中这将是语法错误。

for还有几个可用的缩写形式,所有这些都等同于上面的默认形式并产生相同的输出:

  • 对于单个命令(确切地说:单个管道或多个管道与 &&|| 链接,其中管道也可以只是单个命令)有两个选项:

  • 默认形式,只是没有dodone:

    for string in some random strings to show ; echo _$string
    
  • 没有 in 但有括号,也没有 dodone

    for string (some random strings to show) ; echo _$string
    
  • 对于命令列表(如默认形式),foreach 而不是 for,没有 in,带括号并以 [= 结尾37=]:

    foreach string (some random strings to show) echo _$string ; end
    

在您的例子中,您混合了单个命令的两种缩写形式。由于 in 的存在 zsh 没有将括号作为 for 命令的句法元素。相反,他们解释为 glob 限定符。除了您不打算进行任何文件名扩展之外,失败的原因有两个:

  • 在 glob 限定符之前没有模式(有或没有实际的 glob)。所以任何匹配的文件名都必须完全匹配一个空字符串,这是不可能的

  • 但主要是“一些要打印的随机字符串”不是有效的 glob 限定符。您可能会收到类似“zsh:未知文件属性:i”的错误(至少对于 zsh 5.0.5,它可能取决于 zsh版本)。