如何转义嵌套bash命令返回的空格

时间:2017-08-09 00:50:55

标签: bash escaping

由于问题本身令人困惑,标题有点令人困惑。

先决条件:

我使用此脚本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:这是对更复杂脚本的简化,但保留了原始调用的主要问题。

1 个答案:

答案 0 :(得分:2)

你不能这样做。无论将$(somecommand)视为数据,都不会将其解释为shell语法,因此其中的任何引号和转义都将被视为常规字符。这就是您所看到的 - echo打印的双引号被视为./script.sh参数的一部分,而不是围绕参数的分隔符

另一种思考方式是根据shell解析命令行时所经历的过程。这是一个高度简化的摘要:

  1. 解析命令行,包括引号和转义符。请注意,在此过程中会删除引号和转义符。
  2. 扩展变量($var)和命令替换($( )和反引号命令)等内容。
  3. 对这些扩展的结果执行单词拆分和通配符扩展(除非它们是步骤1中的双引号)。
  4. 请注意,当任何变量扩展或命令替换的结果是命令行的一部分时,引用和转义解析已经完成; shell根本不会将该处理应用于这些扩展的结果。

    现在,根据您实际尝试做的事情,可能还有另一种方法可以实现它。例如,有一些方法可以使用readxargs来分割字符串,同时尊重其中的引号/转义符。还有eval,但如果可能的话,应该避免这种情况 - 它作为一个臭虫磁铁有着当之无愧的声誉。