一、总结
我不明白,为什么我需要E010 bashate rule。
2. 细节
我使用bashate来检查.sh
文件。E010 规则:
不要与for在同一行
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 文档。我发现只有:
一组有助于在控制块中保持一致的规则。这些在有延续的长行中被忽略,因为展开那是一种“有趣”
在语法上,以下两个代码片段是正确且等效的:
可能会说后一个更难阅读,因为它
do
稍微混淆了循环体中的命令。如果循环包含多个命令并且下一个命令在新行上,则混淆将进一步突出显示:...但是将其标记为“错误”是恕我直言,这是某人的个人观点,而不是客观事实。
我想说的是,如果您想在循环中添加命令
do
,那么如果这样可以使代码在阅读代码的人眼中保持一致且可读,则可以随意这样做。一般来说,几乎所有
;
的都可以用换行符代替。和换行符都是;
命令终止符。do
是一个关键字,意思是“下面是需要做的事情(在这个for
循环中)”。是相同的
并作为
和
使用一个而不是另一个的原因是可读性和本地/个人风格约定。
个人观点:
在很长的循环标题中,我认为
do
换行可能是有意义的,如或者
then
inif
语句也是如此。但同样,这取决于一个人的个人风格偏好,或者一个团队/项目使用的任何编码风格。
请注意页面顶部的内容:
PEP8是 Python 代码的样式指南。虽然 Python 人似乎经常非常认真地对待他们的风格问题[需要引用],但这只是一个指南。我们可以想出将 与 放在
do
同一行的好处for
,并将其放在自己的一行上。{
这与启动if
或while
块(或类似)时将 C 代码放在何处的讨论相同。在文档下面几行,还有另一个有趣的规则:
我假设这里的重点是该样式指南的作者认为使用
function
关键字对于读者识别函数声明是必要的。但是,定义函数function foo
是一种非标准方式:标准方式是foo()
. 两者之间的唯一区别(在 Bash 中)是另一个更难移植到标准 shell,例如/bin/sh
在 Debian 或 Ubuntu 中。因此,我建议您将任何和所有此类风格指南都加一粒或三粒盐,然后自己决定最好的风格是什么。一个好的样式检查器允许禁用一些检查(bashate 必须
bashate -i E010,E011
忽略这两个检查。)一个优秀的样式检查器将允许您修改测试,例如检查 E020 的对立面,here。TL;DR:你不需要。这只是一些小伙伴的意见。
像许多其他人一样,几十年来我一直在编写
for
这样的循环:这种布局突出了围绕循环体的事实
do ... done
,就像类 C 语言中的花括号一样,并允许换行符分隔循环构造的组件。当然,关于花括号的放置位置也存在宗教战争,所以你可能会说陪审团仍然在这个问题上。恕我直言,这显然是设计的工作方式;Bourne 喜欢匹配的分隔符,参见。
if ... fi
,case ... esac
, 以及在较短版本中对分号的需求表明您正在使其比最初设计的要短。没有错; 技术的进步和很多曾经看起来是个好主意的东西现在都被反对了,比如goto
. 但在整个 shell 脚本社区采纳bashate
作者的偏好之前,您无需做任何事情。这里有几个很好的答案。始终对风格指南持保留态度,恕我直言和经验,对于任何在风格方面充斥着过多教条的社区,都要稍微到中等程度地关注。几乎就像他们相信,当他们最终得到最后一个 I 点,并且最后一个 T 交叉时,软件就会工作。有时,消除错误需要的不仅仅是完美的风格......
当我开始学习 shell 时,大多数脚本和教程都使用内联分号格式
但是由于我没有经验,所以我很难发现 ; 并且做 - 两者对于确认语法正确性都是必不可少的。所以我更喜欢下一行的 do 本身。我不再那样做了(双关语)
此外,'while' 命令是一个不错的小技巧的绝佳候选者:
但是当准备命令有点庞大,和/或条件很复杂时,最好将其格式化为
然后将do附加为“; do”是积极的。
你甚至可以变得更激烈:
因为每个语句都是一个表达式。注意这两种风格是如何投机取巧地使用的。保持干净,可读性强。以风格或“节省空间”的名义压缩或扭曲它,它变得一团糟。
所以!鉴于 shell 脚本的总体风格相当巴洛克,任何旨在提高清晰度和易于视觉访问重要符号的东西总是一件好事。
当您有一个小命令时,将“do”与命令内联写入的形式很甜蜜——我没有发现“do”在视觉上是隐藏的,内部命令也没有真正被掩盖:
我觉得这看起来很令人愉快,并且它与 while、if 和 case 类似:
清晰和整体整洁是 Codd* 对您的全部要求。
* Edgar F. Codd,关系数据库理论之父。
我很惊讶还没有人提到这种有效且可移植的语法:
仔细注意
for
和do
在同一行,没有分号。结果: