Parameter Erweiterung
Die offensichtliche Antwort ist die Verwendung einer der Sonderformen der Parametererweiterung:
: ${STATE?"Need to set STATE"}
: ${DEST:?"Need to set DEST non-empty"}
Oder besser (siehe Abschnitt "Position der doppelten Anführungszeichen" unten):
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
Die erste Variante (mit nur ?
) erfordert, dass STATE gesetzt wird, aber STATE="" (eine leere Zeichenkette) ist OK - nicht genau das, was Sie wollen, aber die alternative und ältere Notation.
Die zweite Variante (mit :?
) erfordert, dass DEST gesetzt und nicht leer ist.
Wenn Sie keine Nachricht angeben, gibt die Shell eine Standardnachricht aus.
Le site ${var?}
construct ist portabel bis zur Version 7 von UNIX und der Bourne Shell (1978 oder so ähnlich). Die ${var:?}
Konstrukt ist etwas jüngeren Datums: Ich glaube, es war in System III UNIX um 1981, aber vielleicht war es auch schon vorher in PWB UNIX. Es ist daher in der Korn-Shell und in den POSIX-Shells enthalten, insbesondere in der Bash.
Sie ist normalerweise in der Manpage der Shell in einem Abschnitt namens Parameter Erweiterung . Zum Beispiel die bash
sagt das Handbuch:
${parameter:?word}
Fehler anzeigen, wenn Null oder nicht gesetzt. Wenn der Parameter null oder nicht gesetzt ist, wird die Erweiterung von word (oder eine entsprechende Meldung, wenn word nicht vorhanden ist) in den Standardfehler geschrieben und die Shell, falls sie nicht interaktiv ist, beendet. Andernfalls wird der Wert des Parameters ersetzt.
Der Colon-Befehl
Ich sollte vielleicht noch hinzufügen, dass der Doppelpunkt-Befehl einfach seine Argumente auswertet und dann erfolgreich ist. Es ist die ursprüngliche Shell-Kommentarschreibweise (vor ' #
' an das Ende der Zeile). Lange Zeit hatten die Skripte der Bourne-Shell einen Doppelpunkt als erstes Zeichen. Die C-Shell würde ein Skript lesen und anhand des ersten Zeichens feststellen, ob es für die C-Shell bestimmt war (ein ' #
' Hash) oder die Bourne-Shell (ein ' :
' Doppelpunkt). Dann kam der Kernel ins Spiel und fügte Unterstützung für ' #!/path/to/program
' und die Bourne-Shell erhielt ' #
Kommentare, und die Konvention des Doppelpunkts blieb auf der Strecke. Aber wenn Sie auf ein Skript stoßen, das mit einem Doppelpunkt beginnt, wissen Sie jetzt, warum.
Position der doppelten Anführungszeichen
blong fragte in einer Kommentar :
Haben Sie eine Meinung zu dieser Diskussion? https://github.com/koalaman/shellcheck/issues/380#issuecomment-145872749
Das ist der Kern der Diskussion:
Wenn ich jedoch shellcheck
es (mit Version 0.4.1), erhalte ich diese Meldung:
In script.sh line 13:
: ${FOO:?"The environment variable 'FOO' must be set and non-empty"}
^-- SC2086: Double quote to prevent globbing and word splitting.
Gibt es einen Rat, was ich in diesem Fall tun sollte?
Die kurze Antwort lautet: "Tu, was du willst shellcheck
schlägt vor":
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
Um dies zu verdeutlichen, sollten Sie sich folgendes ansehen. Beachten Sie, dass die :
Befehl gibt seine Argumente nicht als Echo aus (aber die Shell wertet die Argumente aus). Wir wollen die Argumente sehen, daher verwendet der folgende Code printf "%s\n"
anstelle von :
.
$ mkdir junk
$ cd junk
$ > abc
$ > def
$ > ghi
$
$ x="*"
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
abc
def
ghi
$ unset x
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
bash: x: You must set x
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
bash: x: You must set x
$ x="*"
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
*
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
abc
def
ghi
$ x=
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$ unset x
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$
Beachten Sie, dass der Wert in $x
wird zunächst erweitert um *
und dann eine Liste von Dateinamen, wenn der Gesamtausdruck nicht in Anführungszeichen steht. Das ist es, was shellcheck
empfohlen wird, behoben werden sollte. Ich habe nicht überprüft, ob die Form, bei der der Ausdruck in doppelte Anführungszeichen eingeschlossen ist, nicht zu beanstanden ist, aber es ist eine vernünftige Annahme, dass es OK wäre.
2 Stimmen
Viele der Antworten auf diese Frage wirken wie etwas, das man auf Code Golf Stack Exchange .