你会引用这个变量赋值,它从一些预先计算的组件构建一条日志消息吗?
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
消失了,即使我尝试在这里和那里放双引号......但现在我明白了$()
脱掉它..
答案 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"