Ответ 1
Используйте двоеточие:
: ${A:=hello}
Двойник - это нулевая команда, которая ничего не делает и игнорирует свои аргументы. Он встроен в bash, поэтому новый процесс не создается.
${параметр: = слово} Назначить значения по умолчанию. Если параметр не задан или нулевой, расширение слова присваивается параметр. Значение параметра затем заменяется. позиционный параметров и специальных параметры не могут быть назначены таким образом.
Я думал, что могу использовать эту функцию для записи ${LONG_VARIABLE_NAME:=hello}
вместо более длинного LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}
, но теперь bash также пытается выполнить 'hello', и это дает команду не найденной. Любой способ избежать этого? Или мне придется придерживаться последнего? Может ли кто-нибудь дать пример, где действительно используется назначение по умолчанию?
Используйте двоеточие:
: ${A:=hello}
Двойник - это нулевая команда, которая ничего не делает и игнорирует свои аргументы. Он встроен в bash, поэтому новый процесс не создается.
Пожалуйста, посмотрите 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
Расширение параметра значения по умолчанию часто полезно в сценариях сборки, например, в примере ниже. Если пользователь просто вызывает 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