假设我必须使用引号来封装子 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
我刚刚通过将$()
subshell 的 stdout 视为引用而取得了成功,因此我只需在变量的扩展上使用内部引号:
# Part of an MSys2 reimplementation of realpath, hence the `-W`
input="../../My Programs"
output=$(cd "$input"; pwd -W)
echo "$output"
中的空格My Programs
被保留并且没有恶意引号出现在output