shell脚本中$ {varname}和$ varname之间的区别是什么

bap*_*ste 7 unix shell

我有一个简单的问题,但我想知道${varname}和之间的区别是$varname什么?

我使用两者,但我没有看到任何差异可以告诉我何时使用其中一个.

dev*_*ull 12

{}在变量名称中使用有助于在执行变量扩展时消除歧义.

考虑两个变量varvarname.让我们看看你想将字符串附加name到变量var.你不能说$varname因为那会导致变量的扩展varname.但是,说${var}name会帮助你达到预期的效果.

$ var="This is var variable."
$ varname="This is varname variable."
$ echo $varname
This is varname variable.
$ echo ${var}name
This is var variable.name
Run Code Online (Sandbox Code Playgroud)

访问数组的任何元素时也需要大括号.

$ a=( foo bar baz )       # Declare an array
$ echo $a[0]              # Accessing first element -- INCORRECT
foo[0]
$ echo ${a[0]}            # Accessing first element -- CORRECT
foo
Run Code Online (Sandbox Code Playgroud)

引用自info bash:

   Any  element  of  an  array may be referenced using ${name[subscript]}.
   The braces are required to avoid conflicts with pathname expansion.
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 10

它们在基本情况下是相同的,但使用${varname}提供了更多的控制和处理变量的能力.它还会跳过可能造成混淆的边缘情况.最后,它启用了Shell参数扩展中描述的变量扩展:

'$'字符引入了参数扩展,命令替换或算术扩展.要扩展的参数名称或符号可以用大括号括起来,大括号是可选的,但用于保护变量从紧跟在其后面的字符扩展,这些字符可以被解释为名称的一部分.

使用大括号时,匹配的结束大括号是第一个未被反斜杠或带引号的字符串转义的'}',而不是嵌入式算术扩展,命令替换或参数扩展.

参数扩展的基本形式是$ {parameter}.参数的值被替换.当参数是具有多个数字的位置参数时,或者当参数后跟不被解释为其名称一部分的字符时,需要括号.

让我们看一个基本的例子.在这里,使用${}允许我们做一些简单的事情$.考虑我们要写$myvar+ "blabla"::

$ myvar=23
$ echo $myvar
23
$ echo $myvarblabla
                        <--- the variable $myvarblabla doesn't exist!
$ echo ${myvar}blabla
23blabla
Run Code Online (Sandbox Code Playgroud)