【问题标题】:Using double quotes within double quotes在双引号内使用双引号
【发布时间】:2016-04-26 16:36:14
【问题描述】:

我有一个包含以下内容的 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=)[^"]*' "   

我没有得到想要的输出。看来我需要正确转义双引号。

【问题讨论】:

  • 这可以说是stackoverflow.com/questions/2005192/…的重复
  • ...顺便说一句,bash 和 POSIX sh 在某些非常相关的方面有所不同(Bourne shell 差异更大,但在 Red Hat 发布的任何产品中都不存在,因此您的标记将其排除在外) .我在答案中包含了一个仅限 bash 的部分,但如果您只标记两者之一,那么这是否可以接受会更清楚。

标签: linux bash shell sh redhat


【解决方案1】:

要回答 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 中不可用,您的问题也已被标记。也就是说,通过覆盖 "$@" 可以使用类似的功能(大概在有限范围内,例如函数,以便保留其原始值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2015-09-06
    • 2014-04-07
    • 2011-04-19
    相关资源
    最近更新 更多