it-swarm.com.de

Zuweisen von Standardwerten zu Shell-Variablen mit einem einzigen Befehl in der Bash

Ich habe eine ganze Reihe von Tests für Variablen in einem bash (3.00) Shell-Skript, bei denen, wenn die Variable nicht gesetzt ist, eine Standardeinstellung zugewiesen wird, z.

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

Ich scheine mich zu erinnern, dass dies in einer Zeile eine Syntax hat, die einem ternären Operator ähnelt, z.

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

(obwohl ich weiß, dass das nicht funktioniert ...)

Bin ich verrückt oder gibt es so etwas?

562

Ganz in der Nähe dessen, was Sie gepostet haben:

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

Oder, der default auch VARIABLE zuweist:

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

Für Befehlszeilenargumente:

VARIABLE=${1:-DEFAULTVALUE}    

dies weist VARIABLE den Wert des ersten an das Skript übergebenen Arguments oder den Wert von DEFAULTVALUE zu, wenn kein solches Argument übergeben wurde.

235
miku

Wenn die Variable gleich ist, dann

: "${VARIABLE:=DEFAULT_VALUE}"

weist VARIABLE DEFAULT_VALUE zu, wenn nicht definiert. Die doppelten Anführungszeichen verhindern das Verschieben und Aufteilen von Wörtern.

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

199
Hans Ginzel

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

mit einer Datei defvalue.sh

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

echo $variable1
echo $variable2

führen Sie die Ausgabe ./defvalue.sh first-value second-value aus

first-value
second-value

und ./defvalue.sh first-value ausgeben

first-value
first-value
30
montells

siehe hier unter 3.5.3 (Shell-Parametererweiterung)

so in deinem Fall

${VARIABLE:-default}
26
ghostdog74

Zur Beantwortung Ihrer Frage und zu allen Variablensubstitutionen

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

Dann gibt es die Möglichkeit, Ihr "Wenn" -Konstrukt enger auszudrücken:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
15
Rob Wells

FWIW, können Sie eine Fehlermeldung wie folgt bereitstellen:

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

Dies zeigt eine Nachricht wie diese an und wird mit Code 1 beendet:

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

Ein vollständigeres Beispiel für alles:

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

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

Ausgabe:

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

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION übernimmt den Wert des ersten Arguments und wird beendet, wenn leer
  • $DIRNAME ist das zweite Argument und standardmäßig das aktuelle Verzeichnis
  • $OUTPUT_DIR ist das 3. Argument oder $HOMEDIR (falls definiert), sonst /tmp. Dies funktioniert unter OS X, aber ich bin mir nicht sicher, dass es portabel ist.
14
Curtis Mattoon

Hier ist ein Beispiel

#!/bin/bash

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

echo "value: [$value]"

speichern Sie dies als script.sh und machen Sie es ausführbar. Führe es ohne Parameter aus

./script.sh
> value: [default_value]

starte es mit param

./script.sh my_value
> value: [my_value]
9
Assaf Shomer