在bash中,为什么我不需要转义嵌套引号?

时间:2014-05-16 21:26:38

标签: bash shell

我有一个名为formatted_deploy_history的变量,它有多行内容。我试图将该内容传递给一系列命令,并将最终结果保存到变量中。这就是我所做的:

nwhin_version="$(echo "${formatted_deploy_history}" | grep "productName" | grep "NHINC" | head -n1 | grep -o "[0-9]*")"

这可以按我想要的方式工作,但似乎应该是语法错误。为什么第二个引号不会干扰命令的其余部分?我期待语法错误,因为这将被解释为:

nwhin_version="$(echo "
带有尾随字符的

3 个答案:

答案 0 :(得分:3)

您的字符串包含命令替换($(...)),这是它自己的世界 - 由$()分隔。

在这个世界里,你可以自由使用双引号而无需转义。

答案 1 :(得分:2)

请参阅POSIX Shell Command Language specification中的第2.3节"令牌识别"

  

如果当前字符是不带引号的$或`,则shell应标识参数扩展(参数扩展),命令替换(命令替换)或算术扩展(算术扩展)的任何候选的开始。他们的引用不带引号的字符序列:$${$(或```和" $((")。shell应读取足够的输入确定要扩展的单元的结尾(如引用部分所述)。在处理字符时,如果发现扩展或引用的实例嵌套在替换中,shell应以指定的方式递归处理它们。找到的构造。从替换开始到结尾的字符,允许识别嵌入构造所需的任何递归,应在结果标记中包含未经修改的字符,包括任何嵌入或封闭的替换运算符或令牌。令牌不由替换结束界定。   

答案 2 :(得分:1)

我相信你不需要围绕命令替换引用。

试试这个:

nwhin_version=$(echo "${formatted_deploy_history}" | grep "productName" | grep "NHINC" | head -n1 | grep -o "[0-9]*")