bash - for循环中的Zsh字符串数组

标签 bash command-line zsh

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

for string in(一些要打印的随机字符串); echo $字符串

最佳答案

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

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

这会产生以下输出:

_some
_random
_strings
_to
_show

因此,echo _$stringin 之后的每个单词运行。列表以换行符结尾。

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

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

像往常一样,将多个 shell 命令放在同一行时,只需将换行符替换为 ;。这里的异常(exception)是 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,带括号并由 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 版本)。

关于bash - for循环中的Zsh字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314187/

相关文章:

linux - 在不同的列中写入变量?

linux - 如何使用多个正则表达式在 Solaris 中查找文件

bash - 在行末添加 sed

c - 多个命令行参数 - 替换单词

macos - 命令在 macOS 终端中未执行,为什么?

bash - 将我的容器入门文件翻译为docker-compose.yml

c++ - 命令行重定向标准输出也应该始终重定向cout吗?

command-line - zsh 究竟是如何扩展 globs 的?

swift - 在 swift 脚本中运行 shell 命令

mysql - 如何使用选项从命令行导出和导入 .sql 文件?