在双引号内使用双引号
Using double quotes within double quotes
我有一个 file1.txt,内容如下:
time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F"
我希望文件如下所示:
9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
实际上,我需要将命令作为字符串传递。这就是为什么 bash 命令需要用双引号括在字符串中的原因。但是,当我包括
" grep -Po '(?<=Fingerprint=)[^"]*' "
我没有得到想要的输出。看来我需要正确转义双引号。
要回答 literal 问题,您可以在命令中使用反斜杠来转义文字双引号。但是,由于 BashFAQ #50 中给出的原因,这是非常糟糕的做法:
# Avoid this absent a very good reason
grep_cmd_str="grep -Po '(?<=Fingerprint=)[^\"]*'"
eval "$grep_cmd_str" <file1.txt # eval is necessary, with all the issues that implies
当你需要存储一个简单的命令(没有重定向或其他 shell 结构)时更好的做法[1]在变量中是使用数组[2],而不是标量变量,来保存它的参数:
# Use this principally if you need to dynamically build up an argument list
grep_args=( grep -Po '(?<=Fingerprint=)[^"]*' )
"${grep_args[@]}" <file1.txt
如果您没有任何约束要求您使用上述任一方法,请考虑一个函数(它允许重定向和 shell 构造,只要它们是硬编码的):
# Use this whenever possible, in preference to the above
grep_fp() { grep -Po '(?<=Fingerprint=)[^"]*' "$@"; }
grep_fp <file1.txt
[1] - 不评估 shell 构造,在此上下文中,是一项安全功能:它保护您免受恶意文件名或值中的类似内容的侵害已被替换为您用作命令的值。
[2] - 请注意数组在 POSIX sh 中不可用,您的问题也被标记为。也就是说,通过重写 "$@"
可以获得类似的功能(大概在有限的范围内,例如函数,以便保留其原始值)。
我有一个 file1.txt,内容如下:
time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F"
我希望文件如下所示:
9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
实际上,我需要将命令作为字符串传递。这就是为什么 bash 命令需要用双引号括在字符串中的原因。但是,当我包括
" grep -Po '(?<=Fingerprint=)[^"]*' "
我没有得到想要的输出。看来我需要正确转义双引号。
要回答 literal 问题,您可以在命令中使用反斜杠来转义文字双引号。但是,由于 BashFAQ #50 中给出的原因,这是非常糟糕的做法:
# Avoid this absent a very good reason
grep_cmd_str="grep -Po '(?<=Fingerprint=)[^\"]*'"
eval "$grep_cmd_str" <file1.txt # eval is necessary, with all the issues that implies
当你需要存储一个简单的命令(没有重定向或其他 shell 结构)时更好的做法[1]在变量中是使用数组[2],而不是标量变量,来保存它的参数:
# Use this principally if you need to dynamically build up an argument list
grep_args=( grep -Po '(?<=Fingerprint=)[^"]*' )
"${grep_args[@]}" <file1.txt
如果您没有任何约束要求您使用上述任一方法,请考虑一个函数(它允许重定向和 shell 构造,只要它们是硬编码的):
# Use this whenever possible, in preference to the above
grep_fp() { grep -Po '(?<=Fingerprint=)[^"]*' "$@"; }
grep_fp <file1.txt
[1] - 不评估 shell 构造,在此上下文中,是一项安全功能:它保护您免受恶意文件名或值中的类似内容的侵害已被替换为您用作命令的值。
[2] - 请注意数组在 POSIX sh 中不可用,您的问题也被标记为。也就是说,通过重写 "$@"
可以获得类似的功能(大概在有限的范围内,例如函数,以便保留其原始值)。