在 bash 中转义引号

Escaping quotes in bash

我正在将文件名作为参数传递给 scp,以写入具有特定名称的文件。

这是 .bash_profile 中别名的一部分,因此我正在尝试自动将当前日期包含在写入的文件名中。

目前,我有这个:

alias getlog='scp admin@censored.co.za:public/censored/current/log/exceptions.log "exceptions_$(date +\"%d_%b_%Y\").log"'

让我们关注scp 命令的第二个参数。它以这种格式写入文件名:

exceptions_"20_Jan_2015".log

首先,引号包含在名称中,这是我不想要的。而且我也更喜欢名称中的空格而不是下划线,因此它看起来像这样:

exceptions 20 Jan 2015.log

我需要了解有关 bash 中的字符串和转义的哪些信息才能执行此操作?

与其使用引号和嵌套引号,不如使用 BASH 函数而不是 alias:

getlog() {
   scp admin@censored.co.za:public/censored/current/log/exceptions.log \
      exceptions_$(date '+%d_%b_%Y').log
}

首先,删除 date 命令参数中双引号上的转义符 - 它们使 shell 将双引号视为格式字符串的一部分(这意味着它们最终会出现在文件名中) 而不是分隔符 around 格式字符串(这是你想要的)。现在您已经有了正确的双引号格式字符串,只需将下划线替换为空格即可。比较 date 命令的前后输出:

$ date +\"%d_%b_%Y\"
"20_Jan_2015"
$ date +"%d %b %Y"
20 Jan 2015

这是最后的别名:

alias getlog='scp admin@censored.co.za:public/censored/current/log/exceptions.log "exceptions_$(date +"%d %b %Y").log"'

请注意,"exceptions_ ... .log" 周围的双引号是为了防止 shell 在日期字符串中的空格上进行分词。