在 zsh 中迭代内联数组

Bay*_*yes 7 zsh

我想弄清楚如何对多个项目执行命令。例如:

我的命令文件A; 我的命令文件B; 我的命令文件C;

我可以这样做:

文件=(文件A文件B文件C)
对于 $files 中的 fl; 我的命令 $fl

当我尝试内联它时,它失败了:

$for fl in (fileA fileB fileC); 回声 $fl
zsh:无效的模式规范

这在 zsh 中可能吗?我浏览了阵列手册,但没有提到如何做到这一点。

mpy*_*mpy 12

$for fl in (fileA fileB fileC); echo $fl
Run Code Online (Sandbox Code Playgroud)

在这里,(被解析为Glob Qualifier的开头,就像在ls *(a+2).

限定符f代表具有匹配规范的访问权限的文件,这就是为什么您会收到错误无效模式规范,因为ileA不是有效的访问权限规范。

如果你尝试例如$for fl in (anotherfileA fileB fileC); echo $fl你得到zsh: number expected,因为a限定符是按访问时间选择的。等等...

那么,如何正确操作呢?-- 在zsh 中,for循环有两种可能的语法:#

  • 第一个在手册页中描述:

    for name ... [ in word ... ] term do list done
    
    Run Code Online (Sandbox Code Playgroud)

    因此,正如@SadBunny已经指出的那样,您示例的正确语法是

    for fl in fileA fileB fileC; echo $fl
    
    Run Code Online (Sandbox Code Playgroud)
  • 数字 2 适用于像我这样的懒人(计算击键次数;)),记录在复杂命令替代形式部分man zshmisc

    for name (word ...) { cmd1; cmd2; }
    
    Run Code Online (Sandbox Code Playgroud)

    通过省略卷曲的刹车,可以简化循环体中只有一个命令:

    for fl (fileA fileB fileC) echo $fl
    
    Run Code Online (Sandbox Code Playgroud)

    恕我直言,这种形式有两个主要优点:

    • 更容易记住(正好一对圆括号,没有或一对大括号)
    • 工作for fl (fileA fileB fileC) mycommand $fl以及for fl ($files) mycommand $fl- 文字值或变量的相同语法。

不计算算术循环形式for (( [expr1] ; [expr2] ; [expr3] )) do list done