10

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

我两者都用,但我看不出有什么区别可以告诉我什么时候使用其中一个。

4

3 回答 3

14

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

考虑两个变量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

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

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

引自info bash

   Any  element  of  an  array may be referenced using ${name[subscript]}.
   The braces are required to avoid conflicts with pathname expansion.
于 2013-10-22T09:03:01.610 回答
12

它们在基本情况下是相同的,但使用${varname}提供了更多的控制和使用变量的能力。它还跳过了可能造成混乱的边缘情况。最后,它支持变量扩展,如Shell Parameter Expansion中所述:

'$' 字符引入了参数扩展、命令替换或算术扩展。要扩展的参数名称或符号可以用大括号括起来,这是可选的,但用于保护要扩展的变量免受紧随其后的字符的影响,这些字符可以解释为名称的一部分。

当使用大括号时,匹配的结束大括号是第一个没有被反斜杠或带引号的字符串转义的'}',并且不在嵌入式算术扩展、命令替换或参数扩展中。

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

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

$ myvar=23
$ echo $myvar
23
$ echo $myvarblabla
                        <--- the variable $myvarblabla doesn't exist!
$ echo ${myvar}blabla
23blabla
于 2013-10-22T09:02:28.580 回答
3

当变量后面有东西时,区别变得很重要:

text="House"
plural="${text}s"

如果没有大括号,shell 将texts被视为不起作用的变量名。

${name-default}当您使用扩展语法指定默认值 ( )、未定义时显示错误 ( ${name?error}) 或模式替换时,大括号也是必需的(有关其他模式,请参阅本文;它适用于 BASH,但大多数也适用于 KSH)

> echo $name-default
-default
> echo ${name-default}
default

有关的:

于 2013-10-31T08:33:23.733 回答