Bash Standardwert zuweisen

135

$ {parameter: = word} Standardwerte zuweisen. Wenn der Parameter nicht gesetzt oder null ist, wird die Erweiterung des Wortes dem Parameter zugewiesen. Der Wert des Parameters wird dann ersetzt. Positionsparameter und spezielle Parameter dürfen auf diese Weise nicht zugeordnet werden.

Ich dachte, ich könnte diese Funktion verwenden, um ${LONG_VARIABLE_NAME:=hello}anstelle der längeren zu schreiben LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, aber jetzt versucht bash auch, 'Hallo' auszuführen, und das gibt einen Befehl, der nicht gefunden wurde. Wie kann man das vermeiden? Oder muss ich mich an Letzteres halten? Kann jemand ein Beispiel geben, in dem die Zuweisung von Standard tatsächlich nützlich ist?

Zedoo
quelle
13
Wenn Sie Text zitieren, ist es hilfreich, einen Link zur Quelle einzufügen.
Jonathon Reinhart

Antworten:

201

Verwenden Sie einen Doppelpunkt:

: ${A:=hello}

Der Doppelpunkt ist ein Nullbefehl, der nichts tut und seine Argumente ignoriert. Es ist in bash integriert, sodass kein neuer Prozess erstellt wird.

camh
quelle
93
Ich kann nicht anders, als zu beobachten, dass : ${A:=hello}das genau so lange dauert A=${A:-hello}. Es scheint auch, dass letzteres etwas weniger esoterisch ist und seine Absicht klarer ist. Die Verwendung :, die im Grunde genommen ein No-Op ist, erscheint im Vergleich zu der Art und Weise, wie das OP es zuvor getan hat, klobig.
Dan Moulding
5
@ Camh: Einverstanden. Ich kann sehen, wo, wenn Sie viele Variablen :hätten, um sie auf Standardwerte zu initialisieren, und sie lange Namen haben, der Ansatz sowohl zum Tippen als auch zum Lesen vorzuziehen wäre. Ja, dies scheint ein Bereich zu sein, in dem Bash eine kleine Verbesserung gebrauchen könnte.
Dan Moulding
17
@ DanMoulding: Was ist mit : ${VERY_LONG_VARIABLE_NAME:=hello}vs.: VERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}. Ich hoffe, Sie verwenden beschreibende Variablennamen in Ihrem Code :)
pihentagy
18
Nicht nur kürzer, sondern auch weniger fehleranfällig : VERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}. Hoppla.
Chepner
5
Ein Vorteil des A=$A:-helloAnsatzes besteht darin, dass er sich beim Ausführen selbst dokumentiert set -x. Das heißt, die Zuweisung wird so gedruckt, als A=hellowürde der Befehl null nur den Wert ( hello) drucken .
lmsurprenant
107

Bitte schauen Sie auf http://www.tldp.org/LDP/abs/html/parameter-substitution.html für Beispiele

${parameter-default}, ${parameter:-default}

Wenn der Parameter nicht festgelegt ist, verwenden Sie die Standardeinstellung. Nach dem Aufruf ist der Parameter immer noch nicht eingestellt.
Beide Formen sind fast gleichwertig. Das Extra :macht nur dann einen Unterschied, wenn der Parameter deklariert wurde, aber null ist.

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

Wenn der Parameter nicht festgelegt ist, setzen Sie den Parameterwert auf den Standardwert.
Beide Formen sind nahezu gleichwertig. Das: macht nur dann einen Unterschied, wenn der Parameter deklariert wurde und null ist

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

Wenn ein Parametersatz vorhanden ist, verwenden Sie alt_value, andernfalls verwenden Sie eine Nullzeichenfolge. Nach dem Aufruf wird der Parameterwert nicht geändert.
Beide Formen sind nahezu gleichwertig. Das: macht nur dann einen Unterschied, wenn der Parameter deklariert wurde und null ist

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam
Jonathan L.
quelle
20

Die Standardwertparametererweiterung ist häufig in Build-Skripten wie dem folgenden Beispiel hilfreich. Wenn der Benutzer das Skript nur so aufruft, wie es ist, wird Perl nicht integriert. Der Benutzer muss explizit WITH_PERLeinen anderen Wert als "no" festlegen , damit es integriert wird.

$ cat defvar.sh
#!/bin/bash

WITH_PERL=${WITH_PERL:-no}

if [[ "$WITH_PERL" != no ]]; then
    echo "building with perl"
    # ./configure --enable=perl
else
    echo "not building with perl"
    # ./configure
fi

Bauen ohne Perl

$ ./defvar.sh
not building with perl

Bauen Sie mit Perl

$ WITH_PERL=yes ./defvar.sh
building with perl
SiegeX
quelle