Parametererweiterung
Die offensichtliche Antwort ist die Verwendung einer der speziellen Formen der Parametererweiterung:
: ${STATE?"Need to set STATE"}
: ${DEST:?"Need to set DEST non-empty"}
Oder besser (siehe Abschnitt "Position der doppelten Anführungszeichen" weiter unten):
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
Für die erste Variante (mit just ?
) muss STATE festgelegt werden, aber STATE = "" (eine leere Zeichenfolge) ist in Ordnung - nicht genau das, was Sie möchten, sondern die alternative und ältere Notation.
Bei der zweiten Variante (using :?
) muss DEST gesetzt und nicht leer sein.
Wenn Sie keine Nachricht angeben, stellt die Shell eine Standardnachricht bereit.
Das ${var?}
Konstrukt ist auf Version 7 UNIX und die Bourne Shell (1978 oder so ungefähr) portierbar. Das ${var:?}
Konstrukt ist etwas jünger: Ich glaube, es war in System III UNIX um 1981, aber es war möglicherweise vorher in PWB UNIX. Es befindet sich daher in der Korn-Shell und in den POSIX-Shells, einschließlich speziell Bash.
Es wird normalerweise in der Manpage der Shell in einem Abschnitt namens Parametererweiterung dokumentiert . Zum Beispiel heißt es im bash
Handbuch:
${parameter:?word}
Anzeigefehler bei Null oder Nicht gesetzt. Wenn der Parameter null oder nicht gesetzt ist, wird die Erweiterung des Wortes (oder eine entsprechende Meldung, wenn kein Wort vorhanden ist) in den Standardfehler geschrieben, und die Shell wird beendet, wenn sie nicht interaktiv ist. Andernfalls wird der Wert des Parameters ersetzt.
Der Doppelpunkt Befehl
Ich sollte wahrscheinlich hinzufügen, dass der Doppelpunkt einfach seine Argumente ausgewertet hat und dann erfolgreich ist. Dies ist die ursprüngliche Shell-Kommentarnotation (vor ' #
' bis zum Zeilenende). Lange Zeit hatten Bourne-Shell-Skripte einen Doppelpunkt als erstes Zeichen. Die C-Shell las ein Skript und verwendete das erste Zeichen, um zu bestimmen, ob es sich um die C-Shell (ein #
Hash) oder die Bourne-Shell (ein :
Doppelpunkt) handelte. Dann mischte sich der Kernel ein und fügte Unterstützung für ' #!/path/to/program
' hinzu , und die Bourne-Shell erhielt ' #
' Kommentare, und die Doppelpunktkonvention blieb auf der Strecke. Wenn Sie jedoch auf ein Skript stoßen, das mit einem Doppelpunkt beginnt, wissen Sie jetzt warum.
Position von doppelten Anführungszeichen
Blong fragte in einem Kommentar :
Irgendwelche Gedanken zu dieser Diskussion? https://github.com/koalaman/shellcheck/issues/380#issuecomment-145872749
Der Kern der Diskussion ist:
… Wenn ich shellcheck
es jedoch (mit Version 0.4.1) bekomme, erhalte ich folgende 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.
Irgendwelche Ratschläge, was ich in diesem Fall tun soll?
Die kurze Antwort lautet "tun wie vorgeschlagen shellcheck
":
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
Um zu veranschaulichen, warum, studieren Sie Folgendes. Beachten Sie, dass der :
Befehl seine Argumente nicht wiedergibt (die Shell wertet die Argumente jedoch aus). Wir wollen die Argumente sehen, daher wird der folgende Code printf "%s\n"
anstelle von verwendet :
.
$ 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, wie der Wert in $x
zuerst auf *
und dann auf eine Liste von Dateinamen erweitert wird, wenn der Gesamtausdruck nicht in doppelte Anführungszeichen steht. Dies ist, was shellcheck
empfohlen wird, sollte behoben werden. Ich habe nicht überprüft, dass es keine Einwände gegen das Formular hat, in dem der Ausdruck in doppelte Anführungszeichen eingeschlossen ist, aber es ist eine vernünftige Annahme, dass es in Ordnung wäre.