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

时间:2013-10-22 08:48:58

标签: shell unix

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

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

3 个答案:

答案 0 :(得分:11)

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

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

答案 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

相关: