子 shell 中嵌套引号

子 shell 中嵌套引号

假设我必须使用引号来封装子 shell 输出,例如:

DATA="$(cat file.hex | xxd -r)"

但我需要嵌套这样的东西:

DATA="$(cat file.hex | xxd -r | tr -d \"$(cat trim.txt)\")"

我不能使用单引号,因为它们不会扩展其中的变量。转义引号不起作用,因为它们只是被视为被动文本。

我该如何处理这个问题?

答案1

您不需要转义子 shell 内的引号,因为当前外壳不解释它们(实际上它不解释从$(到 的任何内容)),并且子外壳不知道上面的任何引用。

在变量赋值时引用子 shell 也是不必要的,有关更多信息,请参阅man bash

答案2

您不需要转义内部的嵌套引号。令人惊讶的是,它们被正确解析了!

DATA="$(cat file.hex | xxd -r | tr -d "$(cat trim.txt)")"

答案3

我刚刚通过将$()subshel​​l 的 stdout 视为引用而取得了成功,因此我只需在变量的扩展上使用内部引号:

# Part of an MSys2 reimplementation of realpath, hence the `-W`
input="../../My Programs"
output=$(cd "$input"; pwd -W) 
echo "$output"

中的空格My Programs被保留并且没有恶意引号出现在output

相关内容