В чем разница между ${varname} и $varname в сценариях оболочки

у меня есть простой вопрос, но мне интересно, в чем разница между ${varname} и $varname ?

Я использую оба, но я не вижу никакой разницы, какие мог сказать мне, когда использовать один или другой.

3 ответов


используя {} в именах переменных помогает избавиться от двусмысленности при выполнении расширения переменных.

рассмотрим две переменные 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.

они одинаковы в основном случае, но с использованием ${varname} дает больше контроля и возможность работы с переменной. Он также пропускает крайние случаи, в которых он может создать путаницу. И, наконец, он включает переменное расширение, как описано в Расширение Параметров Оболочки:

символ " $ " вводит расширение параметра, команду подстановка, или арифметическое разложение. Имя или символ параметра быть расширен может быть заключен в фигурные скобки, которые являются необязательно, но служат защитите переменную, которая будет развернута из символов немедленно после него, который может быть истолкован как часть имени.

при использовании фигурных скобок соответствующая конечная скобка является первой'} ' не экранируется обратной косой чертой или в цитируемой строке, а не в встроенное арифметическое расширение, подстановка команд или параметр расширение.

основной формой расширения параметра является ${parameter}. Значение параметр замененный. Фигурные скобки необходимы, когда параметр a позиционный параметр с более чем одной цифрой, или когда параметр за ним следует символ, который не следует интерпретировать как часть его имя.

давайте посмотрим простой пример. Здесь, использование ${} позволяет нам делать то, что простой $ нет. Рассмотрим, что мы хотим написать $myvar + "blabla"::

$ myvar=23
$ echo $myvar
23
$ echo $myvarblabla
                        <--- the variable $myvarblabla doesn't exist!
$ echo ${myvar}blabla
23blabla

различие становится важным, когда что-то следует за переменной:

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

без скобок, оболочка будет увидеть texts в имя переменной не будет работать.

фигурные скобки также необходимы при использовании расширенного синтаксиса для указания значений по умолчанию (${name-default}), отображение ошибок при неопределенном (${name?error}), или схеме замещения (см. эту статью для других моделей; это для BASH, но большинство работает для KSH как ну)

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

по теме: