【问题标题】:Expanding double quotes escaped with three backslashes in bash?扩展双引号在bash中用三个反斜杠转义?
【发布时间】:2014-09-11 11:59:56
【问题描述】:

bash 为例:

TESTA="testing a \\\"string right here\\\""
echo $TESTA
# testing a \"string right here\"

输出如预期:第一对反斜杠解析为单个反斜杠(\),下一个转义双引号\"扩展为双引号("),所以最后合并结果是\"

现在这对我来说很奇怪:

TESTB=$(echo $TESTA)
echo $TESTB
# testing a \"string right here\"

在这里,我预计 $TESTB内容 确实是 testing a \"string right here\" - 但我预计当打印出来时,转义的双引号 \" 会扩大只是一个双引号",所以我希望打印的结果是未转义的双引号,即testing a "string right here";但这不是我得到的回应,我得到与内容相同的转义双引号......

那么,有没有办法“扩展”$TESTA,使其最终包含未转义的双引号? (我试过 echo -e 应该“启用反斜杠转义的解释”,但它没有帮助)...


编辑:事实证明,对于这种特殊情况,TESTB=$(eval echo "$TESTA") ; echo $TESTB 确实会导致testing a "string right here" - 但我不想eval:如果我以这种方式构建命令行字符串,使用eval 会很麻烦。所以也许我应该更好地改写:由于各种字符串操作,我如何扩展这样的转义双引号(调用外部程序是可以的,只要字符串本身不是eval'd)

【问题讨论】:

  • 不,你是反斜杠转义了反斜杠,所以它被视为一个普通字符,我不知道你为什么会期待别的什么?
  • 您真正想要完成什么?如果您正在尝试构建一个命令行,并且您正在使用 bash、ksh 或 zsh(即带有数组的 shell),那么使用数组比尝试使用引号要好得多。请参阅 bash 常见问题解答:mywiki.wooledge.org/BashFAQ/050(“我正在尝试将命令放入变量中,但复杂的情况总是失败!”)
  • 如果您在字符串中使用\x22 而不是\",您会怎么想。例如:TESTA="testing a \x22string right here\x22"; echo -e $TESTA

标签: string bash escaping


【解决方案1】:

这个怎么样:

TESTA="testing a \"string right here\""
echo $TESTA

这就是你要找的吗?

按照你说的方式

TESTB=$(eval echo "$TESTA") ; echo $TESTB 确实会通过测试“这里的字符串”来产生

但它实际上是打印出来的

 testing a string right here

【讨论】:

  • 谢谢@user3600166 - 出于其他原因,我需要用三个反斜杠转义原始字符串;所以不,这不是我要找的。你在哪里试过TESTB=$(eval echo "$TESTA") ; echo $TESTB?我直接在 shell 中完成了所有这些 - 如果您在脚本中尝试它们,行为可能会有所不同......干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多