从 echo -e 转义字符

Pro*_*iat 2 bash echo quoting escape-characters

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

function log(){

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

但是当我做一些带有撇号的事情时,它会出现某种提示并且没有正确记录它。

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

例子:

$ log this is a testing's post
> hello
> 
> ^C
$
Run Code Online (Sandbox Code Playgroud)

谢谢。

typ*_*ast 7

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

log this is a testing's post

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

log this is a testing\'s post
Run Code Online (Sandbox Code Playgroud)

再次,log是题外话。echo如果你愿意,你可以用普通的旧来试试这个:

echo this is a testing\'s post
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅需要在 bash 中转义哪些字符


Sté*_*las 5

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

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

log "this is a testing's post"
Run Code Online (Sandbox Code Playgroud)

或者:

log this is a testing\'s post
Run Code Online (Sandbox Code Playgroud)

例如。

现在,您需要从中转义字符的地方echo -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
}
Run Code Online (Sandbox Code Playgroud)

(这里使用bash, ksh93, mksh,zsh或 FreeBSDsh语法来表示尚未使用的 POSIX$'...'语法)。

或者使用以下语法:

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

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

无论如何,最好避免echo使用任意数据