Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String bash中的转义引号_String_Macos_Bash_Unix - Fatal编程技术网

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
和更谨慎的引用是可以调用的。我脸上的蛋——没有仔细观察并意识到只有本地文件被参数化,因此不涉及远程取消引用层。这是一个很好的解决方案,但它不能回答我的问题。无论如何谢谢你