标题有点令人困惑,因为问题本身很令人困惑。
先决条件:
我使用此脚本 script.sh
作为传递参数的 Playground :
#!/bin/bash
echo $1
echo $2
echo $3
问题:
我期待这个电话
./script.sh $( echo "foo \"bar baz\"" )
表现得完全一样
./script.sh foo "bar baz"
相应地,我期望得到
foo
bar baz
作为输出结果但返回
foo
"bar
baz"
显然,我需要逃避一些事情。我怀疑这是一个空格,但我不确定。
问题:嵌套的 echo
调用应该是什么样子,以便外部调用接收 2 个参数
PS:这是一个更复杂的脚本的简化,但保留了原始调用的主要问题。
最佳答案
你不能这样做。无论什么 $(somecommand)
都将被视为数据,而不是解释为 shell 语法,因此其中的任何引号和转义符都将被视为常规字符。这就是您所看到的 - echo
打印的双引号被视为 ./script.sh
参数的一部分,而不是分隔符 < em>围绕参数。
另一种思考方式是根据 shell 解析命令行时所经历的过程。以下是高度简化的摘要:
- 解析命令行,包括引号和转义符。请注意,引号和转义符在此过程中被删除。
- 扩展变量 (
$var
) 和命令替换($( )
和反引号命令)等内容。 - 对这些扩展的结果执行分词和通配符扩展(除非它们在步骤 1 中使用双引号)。
请注意,当任何变量扩展或命令替换的结果成为命令行的一部分时,引号和转义解析已经完成; shell 根本不会将该处理应用于这些扩展的结果。
现在,根据您实际想要做什么,可能有另一种方法来完成它。例如,有多种方法可以使用read
或xargs
来分割字符串,同时尊重其中的引号/转义符。还有eval
,但如果可能的话请避免使用——它作为 bug 磁石而享有当之无愧的声誉。
关于bash - 如何转义嵌套 bash 命令返回的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45580005/