我注意到有两种构建循环的替代方法桀骜:
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
他们都打印:
1
2
3
我的问题是,为什么有两种语法?正在$x
迭代不同的对象类型在他们每个人中?
做巴什做出类似的区分?
附录:
为什么以下工作有效?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
但这个没有?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
# It complains with "parse error near `$d'"
for x $d; do print $x;done
答案1
多种形式的复杂命令(例如循环)具有替代形式在 zsh 中。这些形式的灵感大多来自于C壳,这在 zsh 年轻时相当常见,但现在已经消失了。这些替代形式的行为与正常形式完全相同,只是语法不同。它们稍微短一些,但不太清晰。
命令的标准形式for
是for x in 1 2 3; do echo $x; done
,命令的标准形式while
是while test …; do somecommand; done
。 Ksh、bash 和 zsh 有另一种形式for
: for ((i = 0; i < 42; i++)); do somecommand; done
,它模仿for
Pascal 或 C 等语言的循环来枚举整数。 zsh 中存在的其他外来形式是 zsh 特有的(但通常受到 csh 的启发)。
答案2
在我的用例中,我有许多字体文件需要修补(即许多.ttf
文件),并且我想直接在终端中键入并运行脚本命令(不将其存储在脚本文件中):
for x in JetBrainsMonoNL* ; do \
fontforge -script fontpatcher $x --mono -l -q --fontawesome \
--octicons --fontlogos --mdi --powerline --powerlineextra; \
done;
要点是:JetBrainsMonoNL*
将是要循环的数组,如果以第一种形式编写:
for x in (JetBrainsMonoNL*)
括号看起来是多余的(至少对我来说,一个新手),我认为这就是为什么在没有括号的情况下定义标准的原因。
我正在学习如何创建这个脚本并发现了这个问题(基于标题),我认为这个答案对像我这样的新手会有帮助。您可以将此视为已接受答案的现实生活示例。