为什么我需要将“do”与“for”放在同一行?

为什么我需要将“do”与“for”放在同一行?

一、总结

我不明白,为什么我需要E010 巴巴特规则


2. 详细信息

我用巴沙特用于检查.sh文件。 E010规则:

不在同一条线上为了

for巴沙特:

  • 正确的:

    #!/bin/bash
    for f in bash/*.sh; do
        sashacommand "$f"
    done
    
  • 错误:

    #!/bin/bash
    for f in bash/*.sh
        do sashacommand "$f"
    done
    

是否有任何有效的论点,为什么我需要fordo在同一行?


3.没用

我在以下位置找不到问题的答案:

  1. 谷歌
  2. 有关最佳编码实践的文章(例子
  3. bashate 文档。我发现仅有的:

    一组有助于保持控制块中事物一致的规则。这些在有延续的长行上被忽略,因为展开它有点“有趣”

答案1

从语法上看,以下两个代码片段是正确且等效的:

for f in bash/*.sh; do
    sashacommand "$f"
done
for f in bash/*.sh
    do sashacommand "$f"
done

后一种可以可能据说更难阅读,因为do稍微混淆了循环体中的命令。如果循环包含多个命令并且下一个命令位于新行,则混淆将进一步突出显示:

for f in *
    do cmd1
    cmd2
done

...但将其标记为“错误”是恕我直言,某人的个人观点而不是客观事实。

我想说的是,如果您想在循环中的命令前面加上do,那么您可以随意这样做,只要这能使代码在阅读代码的人眼中保持一致和可读。

一般来说,几乎任何一个;都可以被换行符替换。和换行符;都是命令终止符。do是一个关键字,意思是“这里遵循需要完成的操作(在此for循环中)”。

for f in *; do ...; done

是相同的

for f in *
do
   ...
done

并作为

for f in *; do
   ...
done

for f in *
   do ...
done

使用一种而不是另一种的原因是可读性和本地/个人风格约定。


个人想法:

在循环头中很长,我认为添加do一条新线可能是有意义的,如

for i in animals people houses thoughts basketballs bees
do
    ...
done

或者

for i in        \
    animals     \
    people      \
    houses      \
    thoughts    \
    basketballs \
    bees
do
    ...
done

then声明中的也是如此if

但同样,这取决于一个人的个人风格偏好,或者一个团队/项目正在使用的任何编码风格。

答案2

请注意页面顶部的内容:

bashate:bash 脚本的 pep8 等效项

PEP8是 Python 代码风格指南。虽然 Python 人似乎经常非常认真地对待他们的风格问题[需要引用],仅此而已,一个指南。我们可以想出一些好处,既可以将do与 放在同一行for,也可以将它单独放在一行。

这与启动or块(或类似块){时将 C 代码放在何处的讨论相同。ifwhile


文档下面的几行还有另一个有趣的规则:

E020:函数声明不符合格式^function name {$

我认为这里的要点是该风格指南的作者认为使用关键字function对于读者识别函数声明是必要的。然而,function foo是一个非标准定义函数的方式:标准方式是foo().两者(在 Bash 中)之间的唯一区别是另一个更难移植到标准 shell,例如/bin/shDebian 或 Ubuntu。

因此,我建议对所有此类风格指南持保留态度,然后自己决定最好的风格是什么。一个好的样式检查器允许禁用一些检查(bashate 必须bashate -i E010,E011忽略这两个检查。)一个优秀的样式检查器将允许您修改测试,例如检查 E020 的相反情况,在这里。

答案3

TL;DR:你不需要。这只是某个家伙的意见。

和其他许多人一样,我几十年来一直在编写for这样的循环:

for F in arg1 arg2 arg*
do
    somecommand "$F"
done

这种布局突出了围绕循环体的事实do ... done,就像类 C 语言中的大括号一样,并允许换行符分隔循环构造的组件。

当然,关于大括号放在哪里也存在宗教战争,所以你可能会说这个问题还没有定论。恕我直言,这显然就是它的设计原理; Bourne 喜欢匹配的分隔符,参见。if ... ficase ... esac,并且在较短的版本中需要分号表明您使其比最初设计的要短。没有错;技术的进步和许多曾经看似好主意的事情现在都遭到了反对,例如goto。但在整个 shell 脚本社区采纳作者的偏好之前bashate,您无需做任何事情。

答案4

我很惊讶还没有人提到这种有效且可移植的语法:

set alfa bravo charlie
for q do
  echo "$q"
done

仔细注意,fordo位于同一行,没有分号。结果:

alfa
bravo
charlie

相关内容