for循环中的Zsh字符串数组
Zsh array of strings in for loop
我正在尝试在脚本中(在 zsh
中)打印一堆字符串,但它似乎不起作用。如果我将数组放在一个变量中并改为使用它,该代码将起作用。知道为什么这不起作用吗?
for string in (some random strings to print) ; echo $string
勾选 zsh
for
loop 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
zsh 中 for
命令的默认形式不使用括号(如果有的话,它们不会被解释为 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
还有几个可用的缩写形式,所有这些都等同于上面的默认形式并产生相同的输出:
对于单个命令(确切地说:单个管道或多个管道与 &&
或 ||
链接,其中管道也可以只是单个命令)有两个选项:
默认形式,只是没有do
或done
:
for string in some random strings to show ; echo _$string
没有 in
但有括号,也没有 do
或 done
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版本)。
我正在尝试在脚本中(在 zsh
中)打印一堆字符串,但它似乎不起作用。如果我将数组放在一个变量中并改为使用它,该代码将起作用。知道为什么这不起作用吗?
for string in (some random strings to print) ; echo $string
勾选 zsh
for
loop 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
zsh 中 for
命令的默认形式不使用括号(如果有的话,它们不会被解释为 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
还有几个可用的缩写形式,所有这些都等同于上面的默认形式并产生相同的输出:
对于单个命令(确切地说:单个管道或多个管道与
&&
或||
链接,其中管道也可以只是单个命令)有两个选项:默认形式,只是没有
do
或done
:for string in some random strings to show ; echo _$string
没有
in
但有括号,也没有do
或done
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版本)。