我正在尝试弄清楚如何对多个项目执行命令。例如:
我的命令文件 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