我有一个 Bash 脚本,它具有记录时间和状态消息的功能,我只想保留我的脚本 80 列:
#!/bin/bash
log_message() {
echo "[$(date)]-[$1] : $2" >> log.txt
}
varName="John Doe"
# line break to not exceed 80 columns
log_message "WARNING" "I am "${varName}" and i want to limit this line \
to 80 columns"
日志文件中的结果与预期不符:
[Fri Jun 24 13:50:12 CEST 2022]-[WARNING] : I am John
在 Bash 中这样做的正确方法是什么?
在您的情况下,问题不在于行继续,而是您在双引号的第二个参数中使用了双引号而没有转义它们(请注意,看到@Stéphane 的答案,可能是您实际上打算这样做-请参阅下文了解为什么这不是一个好主意)。试试看
使用未转义的引号 before
${varName}
,变量引用现在实际上在双引号之外并受到分词的影响,因此log_message
调用会看到以下参数:WARNING
I am John
(该John
部分仍将被视为第二个标记的一部分,因为它紧跟“关闭”双引号)Doe and i want to limit this line to 80 columns
(Doe
附加到第三个论点的原因与John
第二个论点的一部分相同)但是,您的函数
log_message
仅解释前两个参数,因此剩余的字符串片段会丢失。仅供参考,可以写一个更好
log_message
的:bash
这避免了
date
每次运行一个命令并重新打开日志文件,并让您传递多条消息(每条消息显示在单独的行上)。然后使用
\
@AdminBee 已经提到的行继续。请注意,在 sh/bash 中,与大多数其他语言相反,它围绕参数扩展或您需要的 shell 特殊字符,但引号除外。"...."${var}"..."
你最终留下了未引用的${var}
内容,这意味着它经历了拆分+全局!是一种选择。注意像这样的行延续(
\
后跟换行符),在双引号内或外工作,或在此处的文档中,但不在单引号内或带引号分隔符的此处文档中。有了它
log_message
,你还可以这样做:进入
log.txt
: