良好的Bash引用风格

时间:2013-03-23 00:45:53

标签: bash

你会引用这个变量赋值,它从一些预先计算的组件构建一条日志消息吗?

formatted_message=$(printf '%s [PID %s] %s (%s) %s:%s | %s\n' \
                           "${TIMESTAMP}" \
                           "${PROCESS}" \
                           "${SEVERITY}" \
                           "${SOURCE}" \
                           "${FUNCTION}" \
                           "${LINE}" \
                           "${MESSAGE}")

实际上这是一种很好的Bash编程风格吗?

我喜欢尝试学习一些Bash,但有些东西我发现“效率低下”:

  • 当关于在不同的上下文中引用含义的规则如此之多时,我必须不断解析(使用“思维编译器”)我读取的代码,然后重新读取并重新读取阅读,应用一些特定于上下文的隐式规则(例如表达式的左侧,右侧,应用于数组的扩展与标量值等),这在心理上很麻烦,至少对我而言。在我对世界的简单看法中,有一个固定的约定和简单的例外将允许我更快地读取代码,有时用一两个额外的字符编写代码但是对于一般情况非常“自动”,特别是识别例外更容易。

让我们举一个例子,让我陷入关于“最佳编码实践”的混乱状态:

[[ $x == "$x" ]]

我可以省略左边的引号而没有任何实际的行为改变。将它们添加到评估的右侧会产生重要影响。突然之间,我想知道流程替换和“评估/替换”的所有其他背景,并希望有一种简单的方法可以做到这一点,除了少数例外。

如果有针对此的指导文章/博客文章,我会真正详细研究它,了解(希望)真正的 Bash程序员在他/她放置时想要传达的内容特定位置的引号省略了它们。

注意:我的学习是在晚上的收费站进行的。除了你们之外,我没有其他程序员来比较我的观点和一些开源代码“只是在那里”,没有附带评论证明选择像“编码风格”一样微妙。

另一点:我发现总是输入更容易:

printf "${my_string_var}"

但当然这也很好:

printf "$my_string_var"

(我恰好用{}

更好地“看到”变量扩展

但这对于分词变量内容(?!)

可能不相同
printf $my_string_var # with $my_string_var := 'foo bar'

摘要

如果你只是想回答一个简单,直截了当的问题,并且不要讨论“辩论”:

  • 你会引用上面的第一个作业吗?为什么?

注意:我的一个问题是最终的\n 消失了,即使我尝试在这里和那里放双引号......但现在我明白了$()脱掉它..

1 个答案:

答案 0 :(得分:1)

我不会引用右侧,因为通常的原因(防止无意中的分词)不适用于变量赋值的RHS。

如果您使用bash 4或更高版本,则可以完全取消作业。除此之外,如果您不需要它们来应用参数扩展运算符或将参数名称与相邻字符隔离,我会发现大括号不必要并且分散注意力。当然,引用仍然很重要。

printf -v formatted_message '%s [PID %s] %s (%s) %s:%s | %s\n' \
                       "$TIMESTAMP" \
                       "$PROCESS" \
                       "$SEVERITY" \
                       "$SOURCE" \
                       "$FUNCTION" \
                       "$LINE" \
                       "$MESSAGE"