У меня есть целая группа тестов по переменным в оболочке bash (3.00) script, где, если переменная не установлена, то она назначает по умолчанию, например:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
Кажется, я напоминаю там какой-то синтаксис для этого в одной строке, что-то похожее на тернарный оператор, например:
FOO=${ ${VARIABLE} : 'default' }
(хотя я знаю, что это не сработает...)
Я сумасшедший, или что-то подобное существует?
Очень близко к тому, что вы опубликовали, на самом деле:
FOO=${VARIABLE:-default} # If variable not set, use default.
Или, который также назначит default
на VARIABLE
:
FOO=${VARIABLE:=default} # If variable not set, set it to default.
Для аргументов командной строки:
VARIABLE=${1:-DEFAULTVALUE}
#set VARIABLE with the value of 1st Arg to the script,
#If 1st arg is not entered, set it to DEFAULTVALUE
Если переменная такая же, то
: "${VARIABLE:=DEFAULT_VALUE}"
присваивает DEFAULT_VALUE значение VARIABLE, если оно не определено. Двойные кавычки предотвращают глобирование и разбиение слов.
Также см. раздел 3.5.3, Расширение параметров оболочки в руководстве Bash.
см. здесь в разделе 3.5.3 (расширение параметра оболочки)
поэтому в вашем случае
${VARIABLE:−default}
Даже вы можете использовать как значение по умолчанию значение другой переменной
имеющий файл 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
Тогда существует способ выражения вашей "if" конструкции более кратко:
FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
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, но я не уверен, что он переносится.Вот пример
#!/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]