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

什么';shell脚本中${varname}和$varname之间的区别是什么,shell,unix,Shell,Unix,我有一个简单的问题,但我想知道${varname}和$varname之间的区别是什么 我同时使用这两种方法,但我看不出有什么区别可以告诉我何时使用这两种方法。它们在基本情况下是相同的,但使用${varname}可以更好地控制和处理变量。它还跳过可能造成混淆的边缘情况。最后,它支持变量扩展,如中所述: “$”字符引入参数扩展,命令 替换,或算术展开。要删除的参数名称或符号 可以用大括号括起来,大括号是可选的,但用于 立即保护要展开的变量不包含字符 可解释为名称的一部分 使用大括号时,匹配的结束大括

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


我同时使用这两种方法,但我看不出有什么区别可以告诉我何时使用这两种方法。

它们在基本情况下是相同的,但使用
${varname}
可以更好地控制和处理变量。它还跳过可能造成混淆的边缘情况。最后,它支持变量扩展,如中所述:

“$”字符引入参数扩展,命令 替换,或算术展开。要删除的参数名称或符号 可以用大括号括起来,大括号是可选的,但用于 立即保护要展开的变量不包含字符 可解释为名称的一部分

使用大括号时,匹配的结束大括号是第一个“}”,而不是第一个“}” 通过反斜杠或在带引号的字符串中转义,而不是在 嵌入式算术扩展、命令替换或参数 扩张

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

让我们看一个基本的例子。在这里,
${}
的使用允许我们做一些简单的
$
做不到的事情。我们想写<代码> $MyVa/代码> +<代码> BLABLA“< /代码>::

$myvar=23
$echo$myvar
23
$echo$Myvarbla

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

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

可以使用${name[subscript]}引用数组的任何元素。
需要大括号以避免与路径名扩展冲突。

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

text="House"
plural="${text}s"
如果没有大括号,shell会将
文本
视为变量名,这是行不通的

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

相关的:


正确,但不完整。参见fedorqui+1的帖子,这个问题似乎只是问,如果没有其他参数扩展语法需要大括号,为什么要使用大括号。
text="House"
plural="${text}s"
> echo $name-default
-default
> echo ${name-default}
default