Назначение значений по умолчанию для переменных оболочки с помощью одной команды в bash - PullRequest
544 голосов
/ 06 января 2010

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

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

Кажется, я помню, что в одной строке есть некоторый синтаксис, напоминающий троичный оператор, например ::1004*

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

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

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

Ответы [ 9 ]

981 голосов
/ 06 января 2010

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

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

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

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.
227 голосов
/ 06 января 2010

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

VARIABLE=${1:-DEFAULTVALUE}    

, которая присваивает VARIABLE значение 1-го аргумента, переданного сценарию, или значение DEFAULTVALUE, если такой аргумент не был передан.

191 голосов
/ 22 января 2015

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

: "${VARIABLE:=DEFAULT_VALUE}"

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

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

30 голосов
/ 17 сентября 2014

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

с файлом 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 output

first-value
first-value
25 голосов
/ 06 января 2010

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

так что в вашем случае

${VARIABLE:-default}
15 голосов
/ 16 февраля 2018

Чтобы ответить на ваш вопрос и на все переменные замены

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."
14 голосов
/ 06 января 2010

Тогда есть способ выразить вашу конструкцию «если» более кратко:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
13 голосов
/ 14 июля 2017

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 (если определено), иначе, /tmp. Это работает на OS X, но я не уверен, что он переносимый.
9 голосов
/ 28 июня 2016

Вот пример

#!/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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...