【发布时间】: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