【问题标题】:Zsh array of strings in for loopfor循环中的Zsh字符串数组
【发布时间】:2015-07-09 09:58:58
【问题描述】:

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

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

【问题讨论】:

    标签: bash command-line zsh


    【解决方案1】:

    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 命令时,只需将换行符替换为 ;。这里的例外是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 版本)。

    【讨论】:

    • 很好的答案!但我认为通过一些示例输出可以大大改进它,即使它们看起来微不足道
    【解决方案2】:

    查看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; donefor x in 1 2 3; do echo $x; done 有什么问题?
    • 哇!完全正确!就地使用数组时不需要in?能否请您更新答案,我将标记为答案。
    【解决方案3】:

    您可能正在尝试这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 2015-08-02
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多