Bash присвоить значение по умолчанию

${параметр: = слово}               Назначить значения по умолчанию. Если параметр не задан или нулевой, расширение слова присваивается параметр. Значение параметра затем заменяется. позиционный параметров и специальных               параметры не могут быть назначены таким образом.

Я думал, что могу использовать эту функцию для записи ${LONG_VARIABLE_NAME:=hello} вместо более длинного LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, но теперь bash также пытается выполнить 'hello', и это дает команду не найденной. Любой способ избежать этого? Или мне придется придерживаться последнего? Может ли кто-нибудь дать пример, где действительно используется назначение по умолчанию?

Ответ 1

Используйте двоеточие:

: ${A:=hello}

Двойник - это нулевая команда, которая ничего не делает и игнорирует свои аргументы. Он встроен в bash, поэтому новый процесс не создается.

Ответ 2

Пожалуйста, посмотрите http://www.tldp.org/LDP/abs/html/parameter-substitution.html для примеров

${parameter-default}, ${parameter:-default}

Если параметр не установлен, используйте значение по умолчанию. После вызова параметр все еще не установлен.
Обе формы почти эквивалентны. Дополнительный : имеет значение только тогда, когда параметр объявлен, но имеет значение null.

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

Если параметр не установлен, установите значение параметра по умолчанию.
Обе формы почти эквивалентны. The: имеет значение только тогда, когда параметр объявлен и имеет значение null

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

Если задан параметр, используйте alt_value, иначе используйте пустую строку. После вызова значение параметра не изменилось.
Обе формы почти эквивалентны. The: имеет значение только тогда, когда параметр объявлен и имеет значение null

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam

Ответ 3

Расширение параметра значения по умолчанию часто полезно в сценариях сборки, например, в примере ниже. Если пользователь просто вызывает script as-is, perl не будет встроен. Пользователь должен явно установить WITH_PERL на значение, отличное от "no", чтобы оно было встроено.

$ cat defvar.sh
#!/bin/bash

WITH_PERL=${WITH_PERL:-no}

if [[ "$WITH_PERL" != no ]]; then
    echo "building with perl"
    # ./configure --enable=perl
else
    echo "not building with perl"
    # ./configure
fi

Построение без Perl

$ ./defvar.sh
not building with perl

Сборка с Perl

$ WITH_PERL=yes ./defvar.sh
building with perl