echo -e 中的转义字符

echo -e 中的转义字符

.bashrc我用于日志的文件中有以下内容:

function log(){

  RED="\e[0;31m"
  RESET="\e[0m"
  echo -e "${RED}$(date)" "${RESET}$*" >> "$HOME"/mylog.txt
}

但是,当我执行带有撇号的操作时,它会出现某种提示,并且不会正确记录。

如何转义输入到文件中的所有文本?

例子:

$ log this is a testing's post
> hello
> 
> ^C
$

谢谢。

答案1

echo -e您遇到的问题与您的log()职能无关。问题在于撇号:

log this is a testing's post

shell(在你的例子中是 bash)对于某些字符具有特殊含义。撇号(单引号)用于引用整个字符串,并防止大多数其他类型的插值。bash 希望它们成对出现,这就是为什么您会收到额外的提示行,直到您键入第二个提示行。如果你想在字符串中使用单引号,你需要通过 转义它来告诉 bash,\'如下所示:

log this is a testing\'s post

再说一次,log这不是重点。echo如果你愿意的话,你可以用普通的旧方式尝试一下:

echo this is a testing\'s post

bash中哪些字符需要转义了解更多信息。

答案2

您的问题是因为您输入的命令行包含不匹配的单引号字符。与 无关echo。 shell 发出第二个提示,让您知道它正在等待由以下字符开头的单引号字符串的结尾's po...

'如果您希望将其随意传递给函数,则需要转义log

log "this is a testing's post"

或者:

log this is a testing\'s post

例如。

现在,您需要的地方逃脱字符 fromecho -e是反斜杠字符。例如,如果您将其称为log '\begin',那么它将\b被 转换为 BS 字符echo -e

为了解决这个问题,可以将转义序列与\e这些变量中扩展的转义序列一起存储:

log() {
  RED=$'\e[0;31m'
  RESET=$'\e[0m'
  printf '%s\n' "${RED}$(date) ${RESET}$*" >> "$HOME"/mylog.txt
}

(此处使用bashksh93mkshzshFreeBSDsh语法来表示尚未采用 POSIX 的$'...'语法)。

或者使用这个语法:

log() {
  RED='\e[0;31m'
  RESET='\e[0m'
  printf '%b%s%b %s\n' "$RED" "$(date)" "$RESET" "$*" >> "$HOME"/mylog.txt
}

请注意, 的扩展"$*"取决于 的当前值$IFS

任何状况之下,最好避免echo任意数据

相关内容