parameter - linux bash variable expansion




Zuweisen von Standardwerten zu Shell-Variablen mit einem einzigen Befehl in bash (6)

Ich habe eine ganze Reihe von Tests auf Variablen in einem Bash (3.00) Shell-Skript, wo, wenn die Variable nicht gesetzt ist, dann ein Standard vergeben wird, zB:

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

Ich erinnere mich, dass es eine Syntax gibt, um dies in einer Zeile zu tun, ähnlich einem ternären Operator, zB:

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

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

Bin ich verrückt, oder existiert so etwas?


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

eine Datei defvalue.sh

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

echo $variable1
echo $variable2

Führen Sie ./defvalue.sh first-value second-value

first-value
second-value

und führen ./defvalue.sh first-value Ausgabe von ./defvalue.sh first-value aus

first-value
first-value

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

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

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

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

Dies zeigt eine Nachricht wie folgt an und endet mit Code 1:

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

Ein vollständigeres Beispiel von allem:

#!/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 nimmt den Wert des ersten Arguments und wird beendet, wenn es leer ist
  • $DIRNAME ist das zweite Argument und standardmäßig das aktuelle Verzeichnis
  • $OUTPUT_DIR ist das dritte Argument oder $HOMEDIR (falls definiert), sonst /tmp . Das funktioniert unter OS X, aber ich bin nicht sicher, dass es portabel ist.

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 Params aus

./script.sh
> value: [default_value]

führe es mit param

./script.sh my_value
> value: [my_value]

Um Ihre Frage und alle variablen Ersetzungen zu beantworten

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 "2- $\{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."

Wenn die Variable gleich ist, dann

: "${VARIABLE:=DEFAULT_VALUE}"

weist DEFAULT_VALUE VARIABLE zu, wenn es nicht definiert ist. Die doppelten Anführungszeichen verhindern Globbing und Worttrennung.

Siehe auch Abschnitt 3.5.3, Shell-Parametererweiterung , im Bash-Handbuch.







shell