【问题标题】:How does Bash deal with brackets inside of double quoting?Bash 如何处理双引号内的括号?
【发布时间】:2017-07-31 09:01:04
【问题描述】:

问题基本上是,bash如何处理双引号和括号?

我想不出更好的例子,所以对此表示歉意,但想象一下这样的事情:

"$(echo "${foo}")"

那里会发生什么? ${foo} 技术上是否超出报价范围? bash 是否足够聪明,可以考虑到它在括号内并由内而外地工作? \"${foo}\" 会更好吗?

我试过用谷歌搜索这个,但没有运气。请注意,这与嵌套引用问题不同,因为它包括扩展。

谢谢!

【问题讨论】:

  • 我感觉你理解错了。你能澄清一下你的观点吗?
  • 我想防止分词。两次。因此,我展示的示例是更复杂的命令调用的一部分。 IE。我希望 $(echo ${foo}) 的结果被解释为一个词,但 ${foo} 也应该被解释为一个词。这主要是出于对 bash 转义如何工作的好奇,而不是我无法通过例如解决这个问题。临时变量。

标签: bash shell escaping sh double-quotes


【解决方案1】:

每个命令替换都会建立一个新的引用上下文,因此在嵌套命令替换中避免分词的正确方法是使用双引号。

在此示例中,保留了空白:

$ echo "$(echo "$(echo 'foo     bar')")" # outer echo sees 'foo     bar'
foo     bar

但是,缺少任何双引号意味着字符串被shell分割:

$ echo $(echo "$(echo 'foo     bar')") # outer echo sees 'foo' 'bar'
foo bar
$ echo "$(echo $(echo 'foo     bar'))" # middle echo sees 'foo' 'bar'
foo bar

echo 输出每个参数,用空格分隔,这就是 "foo" 和 "bar" 之间的单个空格的来源。

【讨论】:

  • 多么好的(这不是正确的选择词,但是)编程答案!非常精彩!赞美!
【解决方案2】:

您给出的示例确实完全避免了分词:

"$(echo "${foo}")"

同时,

"$(echo ${foo})"

将使您免于在输出上进行分词,但不会在变量$foo 上进行分词。

$() 打开一个子shell,你也需要在这个子shell 中引用你的变量。考虑以下示例:

"$(echo "$(echo "$foo")")"

以上这对引号都不是可选的,如果你错过任何一个,你将受到分词。

考虑另一个例子:

"$foo var in same shell, $(cmd) - this output is also in the same shell"

在上面,$foocmd 的输出是安全的,但如果 cmd 在 $() 中包含另一个变量,则需要引用该变量。

【讨论】:

  • 谢谢!这就是我的意思,但另一个答案首先出现:/对不起。
  • @Santiago 这不是一场比赛;您应该选择您喜欢的答案,并为对您有帮助的答案投票。
【解决方案3】:

什么是 foo?它是一个价值吗?试试

"$(echo "$\{foo\}")"

【讨论】:

  • 价值是什么意思?如果你的意思是一个变量,那么是的。你有什么理由在括号前转义而不是引号?请参阅我的其他评论以进行澄清:我想防止分词。两次。因此,我展示的示例是更复杂的命令调用的一部分。 IE。我希望 $(echo ${foo}) 的结果被解释为一个词,但 ${foo} 也应该被解释为一个词。这主要是出于对 bash 转义如何工作的好奇,而不是我无法通过例如解决这个问题。临时变量。
  • @Snow 你能不能(试一试)(或者如果不能;PM 我,如果你愿意,我可以帮助你制定答案)尝试 - 尝试详细说明;并写更多(即包括参考资料,我猜是不要用问题回答问题,(如果它是这样的意思-如果不是我道歉!)
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多