我有一个简单的问题,但我想知道${varname}
和$varname
之间的区别是什么?
我使用两者,但我没有看到任何可以告诉我何时使用其中一种的差异。
答案 0 :(得分:11)
在变量名称中使用{}
有助于在执行变量扩展时消除歧义。
考虑两个变量var
和varname
。让我们看一下您想要将字符串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.
答案 1 :(得分:9)
它们在基本情况下是相同的,但使用${varname}
可以提供更多控制和处理变量的能力。它还会跳过可能造成混淆的边缘情况。最后,它支持变量扩展,如Shell Parameter Expansion:
'$'字符引入参数扩展,命令 替换或算术扩展。参数名称或符号 被扩展可以用括号括起来,这是可选的但是可以用来 保护变量立即从字符扩展 跟随它可以被解释为名称的一部分。
当使用大括号时,匹配的结束括号是第一个'}'不是 通过反斜杠或带引号的字符串进行转义,而不是在 嵌入式算术扩展,命令替换或参数 扩展
参数扩展的基本形式是$ {parameter}。的价值 参数被替换。当参数为a时,需要括号 位置参数有多个数字,或参数是 后跟一个不被解释为其中一部分的字符 名。
让我们看一个基本的例子。在这里,${}
的使用允许我们做一些简单$
没有的事情。考虑我们要写$myvar
+ "blabla"
::
$ myvar=23
$ echo $myvar
23
$ echo $myvarblabla
<--- the variable $myvarblabla doesn't exist!
$ echo ${myvar}blabla
23blabla
答案 2 :(得分:3)
当变量跟随变量时,区别变得很重要:
text="House"
plural="${text}s"
如果没有大括号,shell会将texts
视为变量名,但不起作用。
当您使用扩展语法指定默认值(${name-default}
),未定义(${name?error}
)时显示错误或模式替换(see this article for other patterns时,大括号也是必需的;它适用于BASH但大部分也为KSH工作)
> echo $name-default
-default
> echo ${name-default}
default
相关: