Я смотрел на несколько сценариев, написанных другими людьми (в частности, на Red Hat), и многие их переменные присваиваются с использованием следующих обозначений
VARIABLE1="${VARIABLE1:-some_val}"
или некоторых других переменных.
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Какой смысл использовать эту запись вместо простого объявления значений (например, VARIABLE1=some_val
)?
Есть ли преимущества в этой записи или возможные ошибки, которые можно было бы предотвратить?
Имеет ли :-
конкретное значение в этом контексте?
bash
shell-script
scripting
variable
Rothgar
источник
источник
man bash
; поиск по блоку «Расширение параметров» (около 28%). Эти назначения, например, функции по умолчанию: «Используйте значение по умолчанию, только если ни одно еще не было установлено».Ответы:
Этот метод позволяет переменной присвоить значение, если другая переменная либо пуста, либо не определена. ПРИМЕЧАНИЕ. Эта «другая переменная» может быть той же самой или другой переменной.
выдержка
ПРИМЕЧАНИЕ: эта форма также работает
${parameter-word}
. Если вы хотите увидеть полный список всех форм расширения параметров, доступных в Bash, я настоятельно рекомендую вам взглянуть на эту тему в вики Bash Hacker под названием: « Расширение параметров ».Примеры
переменная не существует переменная существуетТо же самое можно сделать, оценив другие переменные или выполнив команды в пределах части значения по умолчанию для обозначения.
Больше примеров
Вы также можете использовать немного другое обозначение, где это просто
VARX=${VARX-<def. value>}
.В приведенном выше
$VAR1
и$VAR2
уже были определены строкой «имеет другое значение» , но$VAR3
был определен, поэтому значение по умолчанию используется вместо0
.Другой пример
Проверка и назначение с использованием
:=
нотацииНаконец, я упомяну удобный оператор
:=
. Это сделает проверку и присвоит значение, если тестируемая переменная пуста или не определена.пример
Обратите внимание, что
$VAR1
теперь установлено. Оператор:=
выполнил тест и назначение в одной операции.Однако, если значение установлено ранее, то оно остается в покое.
Справочная таблица Handy Dandy
Рекомендации
источник
bash
. Тот, что${var:-word}
в Q есть, но не${var-word}
выше. В документации по POSIX есть хорошая таблица, хотя, возможно, стоит скопировать ее в этот ответ - pubs.opengroup.org/onlinepubs/9699919799/utilities/…echo "${FOO:=default}"
отлично, если вы действительно хотитеecho
. Но если вы этого не сделаете, то попробуйте:
встроенный ...: ${FOO:=default}
Ваш$FOO
установленdefault
как выше (то есть, если еще не установлен). Но в этом нет никакого отголоска$FOO
.${4:-$VAR}
будет работать.@slm уже включил в себя документы POSIX, которые очень полезны, но в действительности они не раскрывают, как эти параметры можно комбинировать, чтобы влиять друг на друга. Здесь еще нет упоминания этой формы:
Это отрывок из другого моего ответа , и я думаю, что он очень хорошо демонстрирует, как они работают:
Еще один пример из того же :
Приведенный выше пример использует все 4 формы подстановки параметров POSIX и их различные
:colon null
илиnot null
тесты. Больше информации в ссылке выше, и здесь это снова .Еще одна вещь, о которой люди часто не думают,
${parameter:+expansion}
это то, насколько она может быть полезна в этом документе. Вот еще одна выдержка из другого ответа :ВВЕРХ
Здесь вы установите некоторые значения по умолчанию и подготовитесь распечатать их при вызове ...
БЛИЖНИЙ
Здесь вы определяете другие функции для вызова вашей функции печати на основе их результатов ...
НИЗ
Теперь у вас все настроено, так что вот где вы будете выполнять и извлекать результаты.
РЕЗУЛЬТАТЫ
Я пойду, почему через мгновение, но выполнение выше дает следующие результаты:
КАК ЭТО УСТРОЕНО:
Ключевой особенностью здесь является концепция «
conditional ${parameter} expansion.
Вы можете установить переменную в значение только в том случае, если она не установлена или равна нулю, используя форму:Если вместо этого вы захотите установить только неустановленную переменную, вы бы пропустили
:colon
значения null и остались бы как есть.НА ОБЛАСТИ:
Вы можете заметить это в приведенном выше примере
$PLACE
и$RESULT
изменить его, если настроено через,parameter expansion
хотя_top_of_script_pr()
он уже был вызван, предположительно устанавливая их при запуске. Причина, по которой это работает, заключается в том, что_top_of_script_pr()
это( subshelled )
функция - я включил ее,parens
а не{ curly braces }
использовал для других. Поскольку он вызывается в подоболочке, каждая переменная, которую он устанавливает, имеет значение,locally scoped
и при возврате в родительскую оболочку эти значения исчезают.Но когда
_more_important_function()
наборы$ACTION
этоglobally scoped
так, это влияет на_less_important_function()'s
вторую оценку,$ACTION
потому что_less_important_function()
наборы$ACTION
только через${parameter:=expansion}.
источник
Личный опыт.
Я иногда использую этот формат в своих сценариях для произвольного переопределения значений, например, если у меня есть:
Я могу бегать:
без необходимости изменения исходного значения по умолчанию
SOMETHING
.источник