由于问题本身令人困惑,标题有点令人困惑。
先决条件:
我使用此脚本tagsCount.tagsCount
作为传递参数的操场:
COALESCE (tagsCount.tagsCount, 0)
问题:
我希望这个电话
script.sh
表现完全正确
#!/bin/bash
echo $1
echo $2
echo $3
相应地,我希望得到
./script.sh $( echo "foo \"bar baz\"" )
作为输出结果但返回
./script.sh foo "bar baz"
显然,我需要逃避一些事情。我怀疑这是一个空间,但我不确定。
问题:嵌套foo
bar baz
调用应该如何显示,以便外部调用收到2个参数
PS:这是对更复杂脚本的简化,但保留了原始调用的主要问题。
答案 0 :(得分:2)
你不能这样做。无论将$(somecommand)
视为数据,都不会将其解释为shell语法,因此其中的任何引号和转义都将被视为常规字符。这就是您所看到的 - echo
打印的双引号被视为./script.sh
参数的一部分,而不是围绕参数的分隔符
另一种思考方式是根据shell解析命令行时所经历的过程。这是一个高度简化的摘要:
$var
)和命令替换($( )
和反引号命令)等内容。请注意,当任何变量扩展或命令替换的结果是命令行的一部分时,引用和转义解析已经完成; shell根本不会将该处理应用于这些扩展的结果。
现在,根据您实际尝试做的事情,可能还有另一种方法可以实现它。例如,有一些方法可以使用read
或xargs
来分割字符串,同时尊重其中的引号/转义符。还有eval
,但如果可能的话,应该避免这种情况 - 它作为一个臭虫磁铁有着当之无愧的声誉。