如何在 bash 脚本中正确换行和连接字符串

DEK*_*KER 0 bash string echo

我有一个 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"
Run Code Online (Sandbox Code Playgroud)

日志文件中的结果不符合预期:

[Fri Jun 24 13:50:12 CEST 2022]-[WARNING] : I am John
Run Code Online (Sandbox Code Playgroud)

在 Bash 中执行此操作的正确方法是什么?

Adm*_*Bee 5

在您的情况下,问题不是行延续,而是您在双引号第二个参数中使用了双引号而不转义它们的事实(请注意,看到 @St\xc3\xa9phane 的答案,可能是您实际上是这样的 - 请参阅下文了解为什么这不是一个好主意)。尝试一下

\n
log_message "WARNING" "I am \\"${varName}\\" and i want to limit this line \\\nto 80 columns"\n
Run Code Online (Sandbox Code Playgroud)\n

使用 before 未转义的引号${varName},变量引用现在实际上位于双引号之外并受到分词的影响,因此log_message调用会看到以下参数:

\n
    \n
  • WARNING
  • \n
  • I am John(该John部分仍将被视为第二个标记的一部分,因为它紧跟在“结束”双引号之后)
  • \n
  • Doe and i want to limit this line to 80 columnsDoe出于与第二个参数相同的原因附加到John第三个参数)
  • \n
\n

但是,您的函数log_message仅解释前两个参数,因此剩余的字符串片段会丢失。

\n