Was Sie suchen, ist Indirektion.
assertNotEmpty() {
: "${!1:? "$1 is empty, aborting."}"
}
, dass das Skript verursacht mit einer Fehlermeldung abgebrochen, wenn Sie so etwas tun:
$ foo=""
$ assertNotEmpty foo
bash: !1: foo is empty, aborting.
Wenn Sie wollen Test nur ob foo
leer ist, anstatt das Skript eines Abbruchs, verwenden Sie diese anstelle einer Funktion:
[[ $foo ]]
Zum Beispiel:
until read -p "What is your name? " name && [[ $name ]]; do
echo "You didn't enter your name. Please, try again." >&2
done
Beachten Sie auch, dass es ein sehr wichtiger Unterschied ist zwischen einem leer und ein ungesetzt Parametern. Sie sollten darauf achten, diese Begriffe nicht zu verwechseln! Ein leerer Parameter ist einer, der gesetzt ist, aber nur auf eine leere Zeichenfolge gesetzt ist. Ein nicht gesetzter Parameter ist einer, der gar nicht existiert.
Die vorherigen Beispiele alle Test leer Parameter.Wenn Sie ungesetzt Parameter testen möchten und alle eingestellten Parameter OK prüfen, ob sie leer ist oder nicht, verwenden Sie diese:
[[ ! $foo && ${foo-_} ]]
es in einer Funktion wie folgt verwendet:
assertIsSet() {
[[ ! ${!1} && ${!1-_} ]] && {
echo "$1 is not set, aborting." >&2
exit 1
}
}
Welche bricht das Skript nur, wenn der Parametername Sie einen Parameter übergeben bezeichnet, die nicht gesetzt ist:
$ (foo="blah"; assertIsSet foo; echo "Still running.")
Still running.
$ (foo=""; assertIsSet foo; echo "Still running.")
Still running.
$ (unset foo; assertIsSet foo; echo "Still running.")
foo is not set, aborting.
Ihr Titel sagt "nicht gesetzt", aber Ihr Beispiel Tests für "entweder nicht gesetzt oder auf die leere Zeichenfolge gesetzt". Welchen Fall interessieren Sie? –