В сценариях оболочки, когда мы используем {}
при расширении переменных?
Например, я видел следующее:
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
Есть ли существенная разница или это просто стиль? Один предпочтительнее другого?
bash
shell
syntax
curly-braces
Новый пользователь
источник
источник
{}
известен как расширение скобки .${}
известен как расширение переменной. Они делают разные вещи. Я бы поддержал вас, за исключением бита без расширения.$()
используется для выполнения команды, котораяmd5sum=$(md5sum foo.bin)
будет хранить выходные данныеmd5sum foo.bin
в переменнойmd5sum
, теперь доступной через${md5sum}
. Кроме того, +1 и еще много в духе OP за упоминание, что это хорошая практика, чтобы быть явным!$()
выполняет свою команду из подоболочки .${1:-20}
- это форма расширения параметров. Здесь это неочевидно, потому что в основном используются цифры и арифметические операторы, которые обманывают нас, думая, что здесь задействована арифметика, но на самом деле это относится к позиционному параметру$1
, который, если не определен, будет заменен значением по умолчанию20
(синтаксис равен${variable:-default_value}
).Переменные объявляются и присваиваются без
$
и без{}
. Вы должны использоватьназначить. Чтобы читать из переменной (другими словами, «расширить» переменную), вы должны использовать
$
.Это иногда смущало меня - в других языках мы обращаемся к переменной одинаково, независимо от того, находится она слева или справа от присваивания. Но shell-скриптинг отличается,
$var=10
не делает то, что вы думаете, что делает!источник
Вы используете
{}
для группировки. Скобки необходимы для разыменования элементов массива. Пример:источник
dir=(*)
. Насколько я знаю,dir
это встроенная команда для отображения содержимого каталога (эквивалентноls -C -b
). Не могли бы вы объяснить?dir
это имя переменной, а круглые скобки используются для сбора расширения имени файла*
в массив.Вы также можете сделать некоторые манипуляции с текстом внутри фигурных скобок:
Результат:
или
Результат:
Вы правы, в «обычных переменных» они не нужны ... Но это более полезно для отладки и чтения сценария.
источник
Конец имени переменной обычно обозначается пробелом или новой строкой. Но что, если мы не хотим пробела или новой строки после печати значения переменной? Фигурные скобки указывают интерпретатору оболочки, где находится конец имени переменной.
Классический пример 1) - переменная оболочки без конечных пробелов
Пример 2) Java classpath с версионными банками
(Ответ Фреда уже говорит об этом, но его пример слишком абстрактен)
источник
Вьющиеся фигурные скобки всегда необходимы для доступа к элементам массива и выполнения расширения фигурных скобок.
Хорошо быть не слишком осторожным и использовать его
{}
для расширения переменных оболочки, даже если нет места для двусмысленности.Например:
Итак, лучше написать три строки:
что определенно более читабельно.
Поскольку имя переменной не может начинаться с цифры, оболочка не нуждается
{}
в пронумерованных переменных (например$1
,$2
и т. Д.), Если за таким расширением не следует цифра. Это слишком тонко, и это явно позволяет использовать{}
в таких контекстах:Видеть:
источник
It's good to be not over-cautious
Интересно, что думает большинство людей. Всегда используйте фигурные скобки, чтобы не забыть их, когда они нужны, или используйте их только там, где это необходимо, для улучшения читабельности.Следуя предложению SierraX и Питера о манипулировании текстом, фигурные скобки
{}
используются, например, для передачи переменной команде:Допустим, у вас есть файл sposi.txt, содержащий первую строку известного итальянского романа:
Ouput:
quel ramo del lago di como che volge a mezzogiorno
Теперь создайте две переменные:
Теперь замените содержимое переменной word на new_word внутри файла sposi.txt.
Ouput:
quel filone del lago di como che volge a mezzogiorno
Слово "ramo" было заменено.
источник
weel-known novel
бит. Поддержал все же.