zsh 和 bash 中的 For 循环

zsh 和 bash 中的 For 循环

我注意到有两种构建循环的替代方法桀骜:

  1. for x (1 2 3); do echo $x; done
  2. 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 年轻时相当常见,但现在已经消失了。这些替代形式的行为与正常形式完全相同,只是语法不同。它们稍微短一些,但不太清晰。

命令的标准形式forfor x in 1 2 3; do echo $x; done,命令的标准形式whilewhile test …; do somecommand; done。 Ksh、bash 和 zsh 有另一种形式for: for ((i = 0; i < 42; i++)); do somecommand; done,它模仿forPascal 或 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*)

括号看起来是多余的(至少对我来说,一个新手),我认为这就是为什么在没有括号的情况下定义标准的原因。


我正在学习如何创建这个脚本并发现了这个问题(基于标题),我认为这个答案对像我这样的新手会有帮助。您可以将此视为已接受答案的现实生活示例。

相关内容