在 shell 中,变量扩展是否发生在命令替换中?

问题描述 投票:0回答:1

我知道变量扩展发生在命令替换之前,但我仍然不确定这一点。

给定“name”是一个值为“abc”的shell变量,当我运行

echo $(echo $name)
时,以下哪一项是正确的:

  • 变量首先被扩展(在“外部”级别)。代码变为
    echo $(echo abc)
    ,然后发生命令替换。
  • name
    不是直接展开的。相反,变量扩展发生在
    $(echo $name)
    内部。

我尝试了以下方法。

$ name=abc
$ echo $(name=xyz; echo $name)

代码确实输出了 xyz,这表明 $name 的扩展发生在

$()
内部。这似乎与由于命令替换而发生变量扩展的规则相矛盾。

我确实发现了一个类似的问题变量扩展和命令替换之间的扩展顺序,但那是13年前的事了,而且还没有令人信服的答案。

bash shell
1个回答
0
投票

EXPANSION
man bash
部分:

       The  order of expansions is: brace expansion; tilde expansion, parameter
       and variable expansion, arithmetic expansion, and  command  substitution
       (done   in  a  left-to-right  fashion);  word  splitting;  and  pathname
       expansion.

Command Substitution
部分:

       When using the $(command) form,  all  characters  between
       the parentheses make up the command; none are treated specially.

因此,

$()
中的命令保持不变(命令替换中没有扩展),直到它在子 shell 中执行。
然后,完成相同顺序的扩展(大括号、波形符、参数和变量、算术、命令替换、分词、路径名)。

因此我们可以肯定地说结果将是:

$ name=abc
$ echo $(name=xyz; echo $name)
xyz
© www.soinside.com 2019 - 2024. All rights reserved.