Присвоение значений по умолчанию переменным оболочки одной командой в bash

319

У меня есть целая группа тестов по переменным в оболочке bash (3.00) script, где, если переменная не установлена, то она назначает по умолчанию, например:

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

Кажется, я напоминаю там какой-то синтаксис для этого в одной строке, что-то похожее на тернарный оператор, например:

FOO=${ ${VARIABLE} : 'default' }

(хотя я знаю, что это не сработает...)

Я сумасшедший, или что-то подобное существует?

Теги:

8 ответов

550
Лучший ответ

Очень близко к тому, что вы опубликовали, на самом деле:

FOO=${VARIABLE:-default}  # If variable not set, use default.

Или, который также назначит default на VARIABLE:

FOO=${VARIABLE:=default}  # If variable not set, set it to default.
  • 40
    Если бы я хотел найти это в документации, для чего нужен Google? Поиск в Google со специальными символами, такими как $ {: -}, не очень прост.
  • 15
    В ответ на solarmist: «назначение переменных bash по умолчанию» разрешило мне перейти на эту страницу, и поиск страницы руководства bash с «переменной задницей» привел меня к нужному разделу после ~ пяти 'next'
Показать ещё 14 комментариев
139

Для аргументов командной строки:

VARIABLE=${1:-DEFAULTVALUE}    

#set VARIABLE with the value of 1st Arg to the script,
#If 1st arg is not entered, set it to DEFAULTVALUE
103

Если переменная такая же, то

: "${VARIABLE:=DEFAULT_VALUE}"

присваивает DEFAULT_VALUE значение VARIABLE, если оно не определено. Двойные кавычки предотвращают глобирование и разбиение слов.

Также см. раздел 3.5.3, Расширение параметров оболочки в руководстве Bash.

  • 4
    Я просто возвращаюсь к этому снова, снова и снова !!!
  • 17
    Этот хитрый трюк не был очевиден для меня, используя встроенную команду: no-effect, чтобы съесть расширение $ {..} НО, оставляя VARIABLE установленным. До сих пор я делал это: VARIABLE = "$ {VARIABLE: -DEFAULT_VALUE}" и чувствовал себя глупо из-за использования VARIABLE дважды.
Показать ещё 3 комментария
18

см. здесь в разделе 3.5.3 (расширение параметра оболочки)

поэтому в вашем случае

${VARIABLE:−default}
15

Даже вы можете использовать как значение по умолчанию значение другой переменной

имеющий файл 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
  • 1
    Спасибо за пример с $ 1, $ 2 ...
10

Тогда существует способ выражения вашей "if" конструкции более кратко:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
  • 4
    это хорошо для совместимости с ранними оболочками
  • 2
    Это хорошо для совместимости с OS X Bash.
7

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, но я не уверен, что он переносится.
7

Вот пример

#!/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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню