Когда нам нужны фигурные скобки вокруг переменных оболочки?

348

В сценариях оболочки, когда мы используем {} при расширении переменных?

Например, я видел следующее:

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

Есть ли существенная разница, или это просто стиль? Один из них предпочтительнее другого?

Теги:
curly-braces

5 ответов

431
Лучший ответ

В этом конкретном примере это не имеет значения. Тем не менее, {} in ${} полезны, если вы хотите развернуть переменную foo в строке

"${foo}bar"

так как "$foobar" вместо этого будет расширяться foobar.

Кудрявые скобки также безоговорочно необходимы, если:

  • расширяющие элементы массива, как в ${array[42]}
  • используя операции расширения параметров, как в ${filename%.*} (удалить расширение)
  • расширение позиционных параметров за пределами 9: "$8 $9 ${10} ${11}"

Выполнение этого везде, а не только в потенциально двусмысленных случаях, можно считать хорошей практикой программирования. Это как для согласованности, так и для избежания сюрпризов, таких как $foo_$bar.jpg, где не очевидно, что подчеркивание становится частью имени переменной.

  • 84
    {} известен как расширение скобки . ${} известен как расширение переменной. Они делают разные вещи. Я бы поддержал вас, за исключением бита без расширения.
  • 3
    @NewUser " Так что кроме массивов это на самом деле не требуется " Не так, фигурные скобки необходимы для расширения PARAMETER , очень полезной конструкции в сценариях. Я видел много сценариев sed и awk, которые можно заменить небольшим расширением параметров.
Показать ещё 7 комментариев
93

Переменные объявляются и назначаются без $ и без {}. Вы должны использовать

var=10

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

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e expand a variable called varbar, if it exists.

Это иногда меня путало - на других языках мы ссылаемся на переменную таким же образом, независимо от того, находится ли она слева или справа от назначения. Но shell-scripting отличается, $var=10 не делает то, что вы можете себе представить!

20

Вы используете {} для группировки. Скобки необходимы для разыменования элементов массива. Пример:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect
  • 0
    Я не мог понять первую строку dir=(*) . Насколько я знаю, dir - это встроенная команда для отображения содержимого каталога (эквивалентно ls -C -b ). Не могли бы вы объяснить?
  • 1
    В программировании оболочки команды и аргументы должны быть отделены друг от друга пробелом. Здесь вы видите знак равенства без пробелов, это означает, что это присваивание переменной. dir - это имя переменной, а круглые скобки используются для сбора расширения файла * в массив.
15

Вы также можете выполнять манипуляции с текстом внутри фигурных скобок:

STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}

Результат:

./folder/subfolder/file.txt ./folder

или

STRING="This is a string"
echo ${STRING// /_}

Результат:

This_is_a_string

Вы правы в "обычных переменных" не нужны... Но это более полезно для отладки и чтения script.

4

Конец имени переменной обычно обозначается пробелом или новой строкой. Но что, если мы не хотим, чтобы пространство или новая строка после печати значения переменной? В фигурных скобках указывается интерпретатор оболочки, где конец имени переменной.

Пример:

TIME=10

# WRONG: no such variable called 'TIMEsecs'
echo "Time taken = $TIMEsecs"

# What we want is $TIME followed by "secs" with no whitespace between the two.
echo "Time taken = ${TIME}secs"

(Ответ Fred уже утверждает это, но его пример немного абстрактный)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню