Ich habe ein Bash-Skript, das ungefähr so aussieht:
#!/bin/bash
if [ $1 = "--test" ] || [ $1 = "-t" ]; then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Ich möchte es also nicht nur mit ./script --test
oder ausführen können ./script -t
, sondern auch ohne Argumente (nur ./script
). Wenn ich das mit dem aktuellen Code mache, ist die Ausgabe anscheinend einfach:
./script: line 3: [: =: unary operator expected
./script: line 3: [: =: unary operator expected
Not testing.
Wie programmiere ich es also so, dass es ohne Argumente funktioniert, else
ohne den Fehler auszulösen? Was mache ich falsch?
command-line
bash
scripts
Peter Cordes
quelle
quelle
Antworten:
Die "richtige Art", lange Optionen in Shell- Skripten zu verwenden, ist das GNU-Dienstprogramm getopt . Es gibt auch getopts, die eine eingebaute Bash-Funktion sind , die jedoch nur kurze Optionen wie zulässt
-t
. Einigegetopt
Anwendungsbeispiele finden Sie hier .Hier ist ein Skript, das zeigt, wie ich mit Ihrer Frage umgehen würde. Erläuterungen zu den meisten Schritten werden als Kommentare im Skript selbst hinzugefügt.
Mit ein paar Vereinfachungen und entfernten Kommentaren kann dies zu Folgendem zusammengefasst werden:
quelle
Verschiedene Wege; Die zwei offensichtlichsten sind:
$1
doppelte Anführungszeichen:if [ "$1" = "--test" ]
Besser noch, benutze getopts.
quelle
[ "x$1" = "x--test" ]
darin, Befehlszeilenargumente, die gültige Operatoren für den[
Befehl sind, erneut zu verteidigen . (Dies ist ein weiterer Grund, warum[[ ]]
es bevorzugt wird: Es ist Teil der Shell-Syntax, nicht nur ein eingebauter Befehl.)Sie müssen Ihre Variablen in der if-Bedingung angeben. Ersetzen:
mit:
Dann klappt es:
Setzen Sie Ihre Variablen immer in doppelte Anführungszeichen!
quelle
foo=bar echo '$foo'
druckt$foo
an den Ausgang, sondernfoo=bar echo "$foo"
drucktbar
statt.Sie verwenden Bash. Bash hat eine gute Alternative zu
[
:[[
. Mit[[
müssen Sie sich keine Gedanken über das Zitieren machen, und Sie erhalten viel mehr Operatoren als[
, einschließlich der richtigen Unterstützung für||
:Oder Sie können reguläre Ausdrücke verwenden:
Natürlich sollte immer korrekt zitiert werden, aber es gibt keinen Grund,
[
bei der Verwendung von Bash zu bleiben .quelle
So testen Sie, ob Argumente vorhanden sind (im Allgemeinen und führen Sie die entsprechenden Aktionen aus):
quelle
[ -z "$1" ]
?$check
vor allen anderenshift
s nur einmal zu verwenden , daher ist es besser,$1
stattdessen zu verwenden .#!
bei der Bereitstellung von Beispielen keine Shebangs zu verwenden (Sie sollten die Shell außerhalb des Codes beschreiben).