最近,我听到一个故事,在一个 shell 脚本中,当它被使用时,花括号中的${variable}
变量从同名的环境变量中获取它的值(如果存在),但是如果它被用作$variable
一个,它的值来自局部变量正如它所期望的(并且应该是)..是真的吗?
因为据我所知$...
and${...}
是等价的形式,我从来没有遇到过这样的问题。除非是过去的误解,否则有人可以谈谈可能出现这种情况的条件。
最近,我听到一个故事,在一个 shell 脚本中,当它被使用时,花括号中的${variable}
变量从同名的环境变量中获取它的值(如果存在),但是如果它被用作$variable
一个,它的值来自局部变量正如它所期望的(并且应该是)..是真的吗?
因为据我所知$...
and${...}
是等价的形式,我从来没有遇到过这样的问题。除非是过去的误解,否则有人可以谈谈可能出现这种情况的条件。
这个故事是胡说八道,就变量范围而言,两种形式都是等价的。这是标准所说的:
${parameter}
的值(如果有)
parameter
将被替换。参数名称或符号可以用大括号括起来,这是可选的,除了具有多于一位的位置参数或当参数后跟可以解释为名称一部分的字符时。匹配的右大括号将通过计算大括号级别、跳过带引号的字符串和命令替换来确定。
如果参数名称或符号未包含在大括号中,则扩展将使用最长的有效名称(参见 XBD 规范中的名称,词汇表),无论该名称表示的符号是否存在。当 shell 扫描其输入以确定名称的边界时,它不受其对已定义名称的了解的约束。例如,如果
F
是已定义的 shell 变量,则命令:echo $Fred
不回显
$F
后跟red
;的值 它选择最长的有效名称,Fred
在这种情况下可能未设置。