В сценариях оболочки, когда мы используем {}
при расширении переменных?
Например, я видел следующее:
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
Есть ли существенная разница, или это просто стиль? Один из них предпочтительнее другого?
В этом конкретном примере это не имеет значения. Тем не менее, {}
in ${}
полезны, если вы хотите развернуть переменную foo
в строке
"${foo}bar"
так как "$foobar"
вместо этого будет расширяться foobar
.
Кудрявые скобки также безоговорочно необходимы, если:
${array[42]}
${filename%.*}
(удалить расширение)"$8 $9 ${10} ${11}"
Выполнение этого везде, а не только в потенциально двусмысленных случаях, можно считать хорошей практикой программирования. Это как для согласованности, так и для избежания сюрпризов, таких как $foo_$bar.jpg
, где не очевидно, что подчеркивание становится частью имени переменной.
Переменные объявляются и назначаются без $
и без {}
. Вы должны использовать
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
не делает то, что вы можете себе представить!
Вы используете {}
для группировки. Скобки необходимы для разыменования элементов массива. Пример:
dir=(*) # store the contents of the directory into an array
echo "${dir[0]}" # get the first entry.
echo "$dir[0]" # incorrect
dir=(*)
. Насколько я знаю, dir
- это встроенная команда для отображения содержимого каталога (эквивалентно ls -C -b
). Не могли бы вы объяснить?
dir
- это имя переменной, а круглые скобки используются для сбора расширения файла *
в массив.
Вы также можете выполнять манипуляции с текстом внутри фигурных скобок:
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.
Конец имени переменной обычно обозначается пробелом или новой строкой. Но что, если мы не хотим, чтобы пространство или новая строка после печати значения переменной? В фигурных скобках указывается интерпретатор оболочки, где конец имени переменной.
Пример:
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 уже утверждает это, но его пример немного абстрактный)
{}
известен как расширение скобки .${}
известен как расширение переменной. Они делают разные вещи. Я бы поддержал вас, за исключением бита без расширения.