2

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

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 消失了,即使我尝试在这里和那里加上双引号..但现在我明白它会$()剥离它..

4

1 回答 1

1

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

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

printf -v formatted_message '%s [PID %s] %s (%s) %s:%s | %s\n' \
                       "$TIMESTAMP" \
                       "$PROCESS" \
                       "$SEVERITY" \
                       "$SOURCE" \
                       "$FUNCTION" \
                       "$LINE" \
                       "$MESSAGE"
于 2013-03-23T13:31:55.250 回答