String bash中的转义引号
我将文件名作为参数传递给String bash中的转义引号,string,macos,bash,unix,String,Macos,Bash,Unix,我将文件名作为参数传递给scp,以编写具有特定名称的文件 这是.bash_配置文件中别名的一部分,因此我尝试自动将当前日期包含在写入的文件名中 目前,我有以下几点: alias getlog='scp admin@censored.co.za:public/censored/current/log/exceptions.log "exceptions_$(date +\"%d_%b_%Y\").log"' 让我们关注一下scp命令的第二个参数。它以以下格式写入文件名: 例外情况“2015年1月
scp
,以编写具有特定名称的文件
这是.bash_配置文件中别名的一部分,因此我尝试自动将当前日期包含在写入的文件名中
目前,我有以下几点:
alias getlog='scp admin@censored.co.za:public/censored/current/log/exceptions.log "exceptions_$(date +\"%d_%b_%Y\").log"'
让我们关注一下scp
命令的第二个参数。它以以下格式写入文件名:
例外情况“2015年1月20日”。日志
首先,名称中包含引号,这是我不想要的。我也更喜欢名称中的空格而不是下划线,因此它看起来像这样:
例外情况2015年1月20日。日志
要做到这一点,我需要了解有关bash中字符串和转义的哪些信息?与其使用引号和嵌套引号,不如使用bash函数而不是
别名:
getlog() {
scp admin@censored.co.za:public/censored/current/log/exceptions.log \
exceptions_$(date '+%d_%b_%Y').log
}
首先,删除date命令参数中双引号上的转义符-它们使shell将双引号视为格式字符串的一部分(这意味着它们最终会出现在文件名中),而不是格式字符串周围的分隔符(这是您想要的)。现在您有了一个正确的双引号格式字符串,只需将下划线替换为空格即可。比较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\uu…log”
周围加上双引号,以防止shell在日期字符串中的空格上分词。如果您不想在文件名中加引号,为什么要在日期
格式中加引号?关于转义,您需要知道的一点是,转义引号只是另一个字符。如果你想用空格替换下划线,那就这样做吧,但是要么反斜杠转义空格(这样它们就只是另一个字符),要么用未加斜线的引号引用格式(这样它们才是真正的引号)。要深入讨论shell引号,我建议--这是很多内容,但是,这是一个大而重要的主题……通过ssh或scp传递内容实际上比一般情况更为复杂,引用起来更为明智——如果远程shell执行扩展(在scp的情况下)或运行作为参数给出的命令(在ssh的情况下),可以通过代码来解释任何要处理的数据,那么就会对安全产生影响. 因此,对这个问题的全面回答要比只解决眼前的问题而不考虑生成要与scp一起使用的数据复杂得多。这是正确的。这也不是一个完全通用的答案——对于date
发出的内容非常有用,但是在有更有趣的变量替换的情况下,printf%q
和更谨慎的引用是可以调用的。我脸上的蛋——没有仔细观察并意识到只有本地文件被参数化,因此不涉及远程取消引用层。这是一个很好的解决方案,但它不能回答我的问题。无论如何谢谢你