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? 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.
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.
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.
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
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."
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
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.
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}
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]
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