【发布时间】:2015-07-09 09:58:58
【问题描述】:
我试图在脚本(zsh)中打印一堆字符串,但它似乎不起作用。如果我将数组放在一个变量中并改用它,该代码将起作用。任何想法为什么这不起作用?
for string in (some random strings to print) ; echo $string
【问题讨论】:
标签: bash command-line zsh
我试图在脚本(zsh)中打印一堆字符串,但它似乎不起作用。如果我将数组放在一个变量中并改用它,该代码将起作用。任何想法为什么这不起作用?
for string in (some random strings to print) ; echo $string
【问题讨论】:
标签: bash command-line zsh
zsh 中for 命令的默认形式不使用括号(如果有的话,它们不会被解释为for 语句的一部分):
for string in some random strings to show
do
echo _$string
done
这会产生以下输出:
_some
_random
_strings
_to
_show
因此,echo _$string 在in 之后为每个单词运行。列表以换行符结束。
可以将整个语句写在一行中:
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,带括号并以 end 结尾:
foreach string (some random strings to show) echo _$string ; end
在您的情况下,您混合了单个命令的两种简短形式。由于in 的存在,zsh 没有将括号作为for 命令的句法元素。相反,它们被解释为 glob 限定符。除了您不打算进行任何文件名扩展这一事实之外,这失败的原因有两个:
在 glob 限定符之前没有模式(有或没有实际的 glob)。所以任何匹配的文件名都必须完全匹配一个空字符串,这是不可能的
但主要是“一些要打印的随机字符串”不是有效的 glob 限定符。您可能会收到类似“zsh:未知文件属性:i”的错误(至少对于 zsh 5.0.5,它可能取决于 zsh 版本)。
【讨论】:
查看zshforloop documentation:
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
【讨论】:
for x (1 2 3); do echo $x; done 和 for x in 1 2 3; do echo $x; done 有什么问题?
in?能否请您更新答案,我将标记为答案。
您可能正在尝试这样做:
for string in some random strings to print ;do
echo $string
done
【讨论】: