Назначение значений по умолчанию для переменных оболочки с помощью одной команды в 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]