Назначение значений по умолчанию для переменных оболочки с помощью одной команды в bash
У меня есть целая группа тестов по переменным в оболочке bash (3.00) script, где, если переменная не установлена, то она назначает по умолчанию, например:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
Кажется, я напоминаю там какой-то синтаксис для этого в одной строке, что-то похожее на тернарный оператор, например:
FOO=${ ${VARIABLE} : 'default' }
(хотя я знаю, что это не сработает...)
Я сумасшедший, или что-то подобное существует?
Ответы
Ответ 1
Очень близко к тому, что вы опубликовали, на самом деле:
FOO=${VARIABLE:-default} # If variable not set or null, use default.
Или, который также назначит VARIABLE
по default
:
FOO=${VARIABLE:=default} # If variable not set or null, set it to default.
Ответ 2
Для аргументов командной строки:
VARIABLE=${1:-DEFAULTVALUE}
который присваивает VARIABLE
значение 1-го аргумента, переданного сценарию, или значение DEFAULTVALUE
если такой аргумент не был передан.
Ответ 3
Если переменная такая же, то
: "${VARIABLE:=DEFAULT_VALUE}"
присваивает DEFAULT_VALUE значение VARIABLE, если оно не определено. Двойные кавычки предотвращают глобирование и разбиение слов.
Также см. раздел 3.5.3, Расширение параметров оболочки в руководстве Bash.
Ответ 4
Даже вы можете использовать как значение по умолчанию значение другой переменной
имеющий файл defvalue.sh
#!/bin/bash
variable1=$1
variable2=${2:-$variable1}
echo $variable1
echo $variable2
выполнить ./defvalue.sh first-value second-value
вывод
first-value
second-value
и запустите ./defvalue.sh first-value
вывод
first-value
first-value
Ответ 5
смотрите здесь под 3.5.3 (расширение параметров оболочки)
так в вашем случае
${VARIABLE:-default}
Ответ 6
Ответить на ваш вопрос и по всем заменам переменных
echo "$\{var}"
echo "Substitute the value of var."
echo "$\{var:-word}"
echo "If var is null or unset, word is substituted for var. The value of var does not change."
echo "$\{var:=word}"
echo "If var is null or unset, var is set to the value of word."
echo "$\{var:?message}"
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly."
echo "$\{var:+word}"
echo "If var is set, word is substituted for var. The value of var does not change."
Ответ 7
Тогда существует способ выражения вашей "if" конструкции более кратко:
FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
Ответ 8
FWIW, вы можете предоставить сообщение об ошибке следующим образом:
USERNAME=${1:?"Specify a username"}
Отображает такое сообщение и выходит с кодом 1:
./myscript.sh
./myscript.sh: line 2: 1: Specify a username
Более полный пример всего:
#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}
echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"
Вывод:
$ ./script.sh foo
foo
/path/to/pwd
/tmp
$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
-
$ACTION
принимает значение первого аргумента и выходит, если пуст
-
$DIRNAME
является вторым аргументом и по умолчанию используется текущий каталог
-
$OUTPUT_DIR
- третий аргумент, или $HOMEDIR
(если определено), else, /tmp
. Это работает на OS X, но я не уверен, что он переносится.
Ответ 9
Вот пример
#!/bin/bash
default='default_value'
value=${1:-$default}
echo "value: [$value]"
сохранить это как script.sh и сделать его исполняемым.
запустите его без параметров
./script.sh
> value: [default_value]
запустите его с параметром
./script.sh my_value
> value: [my_value]