1381 Stimmen

Zuweisung von Standardwerten an Shell-Variablen mit einem einzigen Befehl in der Bash

Ich habe eine ganze Reihe von Tests auf Variablen in einem Bash (3.00) Shell-Skript, wo, wenn die Variable nicht gesetzt ist, dann weist es einen Standard, z. B.:

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

Ich glaube mich zu erinnern, dass es eine Syntax gibt, um dies in einer Zeile zu tun, etwas, das einem ternären Operator ähnelt, z. B.:

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

(obwohl ich weiß, dass das nicht funktionieren wird...)

Bin ich verrückt, oder gibt es so etwas?

2 Stimmen

Shell-Parameter-Erweiterung in der Bash-Shell-Referenz ist ein guter Ausgangspunkt: tiswww.case.edu/php/chet/bash/bashref.html#Shell-Expansions .

3 Stimmen

Gnu.org-Dokumentation für Erweiterung der Shell-Parameter (Hinweis: Es gibt noch viele andere coole Sachen, die man machen kann!)

2460voto

Andrew McGregor Punkte 27766

Das kommt dem, was Sie geschrieben haben, sehr nahe. Sie können etwas verwenden, das Bash-Parameter-Erweiterung um dies zu erreichen.

Um den zugewiesenen Wert zu erhalten, oder default wenn es fehlt:

FOO="${VARIABLE:-default}"  # If variable not set or null, use default.
# If VARIABLE was unset or null, it still is after this (no assignment done).

Oder zuweisen default a VARIABLE zur gleichen Zeit:

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

157 Stimmen

Wenn ich dies in der Dokumentation finden wollte, wonach müsste ich googeln? Das Googeln nach Sonderzeichen wie ${:-} ist nicht ganz einfach.

45 Stimmen

Als Antwort auf solarmist: "bash variable assignment default" führte mich zu dieser Seite, und die Suche in der bash-Handbuchseite mit 'variable ass' brachte mich nach ~five 'next' zum richtigen Abschnitt

121 Stimmen

Beachten Sie, dass es sich um no basisspezifisch und funktioniert mit der gesamten Muschelfamilie. Es ist sicher für generische Skripte.

625voto

miku Punkte 170688

Für Befehlszeilenargumente:

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

der zuweist VARIABLE der Wert des 1. Arguments, das an das Skript übergeben wurde, oder der Wert von DEFAULTVALUE wenn kein solches Argument übergeben wurde. Quoting verhindert Globbing und Wortsplitting.

448voto

Hans Ginzel Punkte 6714

Wenn die Variable gleich ist, dann

: "${VARIABLE:=DEFAULT_VALUE}"

vergibt DEFAULT_VALUE a VARIABLE wenn nicht definiert. Die doppelten Anführungszeichen verhindern Globbing und Worttrennung.

Siehe auch Abschnitt 3.5.3, Erweiterung der Shell-Parameter im Bash-Handbuch.

48 Stimmen

Dieser knifflige Trick war für mich nicht offensichtlich, da ich das : no-effect builtin benutze, um die Expansion der ${..} BUT leaving VARIABLE set. Bis jetzt habe ich dies getan: VARIABLE="${VARIABLE:-DEFAULT_VALUE}" und kam mir blöd vor, weil ich VARIABLE zweimal verwendet habe.

2 Stimmen

Es hat sich herausgestellt, dass dies bei BASH-BUILTIN-VARIABELN NICHT IMMER funktioniert. Das ist sehr, sehr seltsam. Die mir derzeit bekannten sind HISTTIMEFORMAT

0 Stimmen

Wie kann ich mehrere Standardwerte festlegen? Ich habe es mit ": ${VARIABLE:=DEFAULT_VALUE} : ${VARIABLE2:=DEFAULT_VALUE2}", aber das scheint nicht zu funktionieren...

142voto

Guru Punkte 1273

Zur Beantwortung Ihrer Frage und zu allen Variablenersetzungen

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."

Sie können den gesamten Ausdruck umgehen, indem Sie ein \ zwischen das Dollarzeichen und den Rest des Ausdrucks setzen.

echo "$\{var}"

6 Stimmen

Außerdem gibt es {var-default} donde default wird nur verwendet, wenn var ist undefiniert. Wenn var ist definiert, aber null, default nicht verwendet werden.

6 Stimmen

Warum gibt es in jeder Zeile einen Backslash? Andere Antworten haben ihn nicht.

67voto

Montells Punkte 6011

Sie können auch als Standardwert den Wert einer anderen Variablen verwenden

mit einer Datei defvalue.sh

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

echo $variable1
echo $variable2

laufen. ./defvalue.sh first-value second-value Ausgabe

first-value
second-value

und laufen ./defvalue.sh first-value Ausgabe

first-value
first-value

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X