Przypisywanie wartości domyślnych do zmiennych powłoki za pomocą jednego polecenia w bash

Mam całą masę testów na zmiennych w skrypcie powłoki bash (3.00), gdzie jeśli zmienna nie jest ustawiona, to przypisuje domyślną, np.:

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

Wydaje mi się, że jest jakaś składnia do robienia tego w jednej linii, coś przypominającego operator trójdzielny, np.:

FOO=${ ${VARIABLE} : 'default' }
(Choć wiem, że to nie zadziała...) Czy jestem szalony, czy coś takiego istnieje?
 813
Author: llrs, 2010-01-06

9 answers

Bardzo zbliżony do tego, co napisałeś.

Aby uzyskać przypisaną wartość, lub default jeśli jej brakuje:

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

Lub przypisać default do VARIABLE w tym samym czasie:

FOO="${VARIABLE:=default}"  # If variable not set or null, set it to default.
 1478
Author: Andrew McGregor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-17 19:06:08

Dla argumentów linii poleceń:

VARIABLE="${1:-$DEFAULTVALUE}"

, która przypisuje VARIABLE wartość pierwszego argumentu przekazanego skryptowi lub wartość DEFAULTVALUE, jeśli taki argument nie został przekazany. Qouting zapobiega globbingowi i podziałowi słów.

 340
Author: miku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-23 16:37:30

Jeśli zmienna jest taka sama, to

: "${VARIABLE:=DEFAULT_VALUE}"

Przypisuje DEFAULT_VALUE do VARIABLE, jeśli nie jest zdefiniowana. Podwójne cudzysłowy zapobiegają globalizowaniu i podziałowi słów.

Patrz również sekcja 3.5.3, rozszerzenie parametrów powłoki , w podręczniku Bash.

 283
Author: Hans Ginzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-09 08:34:33

Nawet można użyć jak wartość domyślna wartość innej zmiennej

Posiadanie pliku defvalue.sh

#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

Run ./defvalue.sh first-value second-value output

first-value
second-value

I uruchom ./defvalue.sh first-value wyjście

first-value
first-value
 48
Author: Montells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 15:50:20

Aby odpowiedzieć na twoje pytanie i na wszystkie zmienne podstawienia

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."
 41
Author: Guru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-25 05:14:32

Zobacz Tutaj pod 3.5.3 (rozszerzenie parametru powłoki)

Więc w Twoim przypadku

${VARIABLE:-default}
 32
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-02 23:32:43

FWIW, możesz podać komunikat o błędzie w następujący sposób:

USERNAME=${1:?"Specify a username"}

Wyświetla taki komunikat i kończy z kodem 1:

./myscript.sh
./myscript.sh: line 2: 1: Specify a username

Bardziej kompletny przykład wszystkiego:

#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"

Wyjście:

$ ./script.sh foo
foo
/path/to/pwd
/tmp

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION pobiera wartość pierwszego argumentu i kończy działanie, jeśli jest pusty
  • $DIRNAME jest drugim argumentem i domyślnie jest to bieżący katalog
  • $OUTPUT_DIR jest trzecim argumentem, lub $HOMEDIR (jeśli zdefiniowano), else, /tmp. To działa na OS X, ale nie jestem na pewno jest przenośny.
 23
Author: Curtis Mattoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 02:09:18

Wtedy jest sposób wyrażania twojego "jeśli" konstruuj bardziej skrótowo:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
 19
Author: Rob Wells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 14:56:28

Oto przykład

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

Zapisz to jako script.sh i uczynić go wykonywalnym. run it without params

./script.sh
> value: [default_value]

Uruchom go z param

./script.sh my_value
> value: [my_value]
 11
Author: Assaf Shomer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 12:18:53