在 zsh 中迭代内联数组

在 zsh 中迭代内联数组

我正在尝试弄清楚如何对多个项目执行命令。例如:

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

我可以这样做:

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

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

$for fl in (文件A 文件B 文件C); echo $fl
zsh:模式规范无效

在 zsh 中可以实现吗?我浏览了数组手册,但没有提到如何做到这一点。

答案1

$for fl in (fileA fileB fileC); echo $fl

这里,(被解析为全局限定符, 像ls *(a+2)

限定词f代表具有与规范匹配的访问权限的文件,这就是你收到错误的原因无效的模式规范,因为ileA不是有效的访问权限规范。

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

那么,该如何正确做呢?- 在 有两种可能的语法为了循环:#

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

    for name ... [ in word ... ] term do list done
    

    这样@SadBunny已经指出,你的例子的正确语法是

    for fl in fileA fileB fileC; echo $fl
    
  • 第二个是为像我这样的懒人准备的(数一下按键次数;)),记录在复杂命令的替代形式部分man zshmisc

    for name (word ...) { cmd1; cmd2; }
    

    通过省略花括号,可以简化为循环体中只有一个命令:

    for fl (fileA fileB fileC) echo $fl
    

    我认为这种形式有两个主要优点:

    • 更容易记住(只有一对圆括号,没有或只有一对花括号)
    • 对于文字值或变量,其语法也for fl (fileA fileB fileC) mycommand $fl一样。for fl ($files) mycommand $fl

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

答案2

当然可以。删除括号:

monsterkill-ub-dt% for fl in (xfile yfile); cat ${fl}
zsh: invalid mode specification

monsterkill-ub-dt% for fl in xfile yfile; cat ${fl}  
x
y

这也有效:

monsterkill-ub-dt% for fl in *; cat ${fl} 
x
y

相关内容