一、总结
我不明白,为什么我需要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
是否有任何有效的论点,为什么我需要for
和do
在同一行?
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 代码放在何处的讨论相同。if
while
文档下面的几行还有另一个有趣的规则:
E020:函数声明不符合格式
^function name {$
我认为这里的要点是该风格指南的作者认为使用关键字function
对于读者识别函数声明是必要的。然而,function foo
是一个非标准定义函数的方式:标准方式是foo()
.两者(在 Bash 中)之间的唯一区别是另一个更难移植到标准 shell,例如/bin/sh
Debian 或 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 ... fi
、case ... esac
,并且在较短的版本中需要分号表明您使其比最初设计的要短。没有错;技术的进步和许多曾经看似好主意的事情现在都遭到了反对,例如goto
。但在整个 shell 脚本社区采纳作者的偏好之前bashate
,您无需做任何事情。
答案4
我很惊讶还没有人提到这种有效且可移植的语法:
set alfa bravo charlie
for q do
echo "$q"
done
仔细注意,for
和do
位于同一行,没有分号。结果:
alfa
bravo
charlie