在 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 在日期字符串中的空格上进行分词。
我正在将文件名作为参数传递给 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 在日期字符串中的空格上进行分词。