Ich möchte, dass mein Bash-Skript eine Fehlermeldung ausgibt, wenn die erforderliche Anzahl von Argumenten nicht erreicht wird.
Ich habe den folgenden Code ausprobiert:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Aus einem unbekannten Grund habe ich folgenden Fehler erhalten:
test: line 4: [2: command not found
Was mache ich falsch?
test
. Das ist der Name eines Standard-Unix-Befehls, den Sie nicht beschatten möchten.test
ist in Ordnung, solange es nicht auf dem Pfad ist?Antworten:
Genau wie jeder andere einfache Befehl
[ ... ]
odertest
erfordert Leerzeichen zwischen seinen Argumenten.Oder
Vorschläge
Wenn Sie in Bash sind, bevorzugen Sie
[[ ]]
stattdessen die Verwendung, da keine Wortaufteilung und Pfadnamenerweiterung für die Variablen durchgeführt wird. Ein Anführungszeichen ist möglicherweise nur erforderlich, wenn es Teil eines Ausdrucks ist.Es hat auch einige andere Funktionen wie nicht zitierte Bedingungsgruppierung, Musterabgleich (erweiterter Musterabgleich mit
extglob
) und Regex-Abgleich.Im folgenden Beispiel wird überprüft, ob Argumente gültig sind. Es erlaubt ein oder zwei Argumente.
Für reine arithmetische Ausdrücke verwenden
(( ))
kann noch besser zu einigen, aber sie sind immer noch möglich , in[[ ]]
mit arithmetischen Operatoren wie-eq
,-ne
,-lt
,-le
,-gt
, oder-ge
durch den Ausdruck als ein einzelnes Zeichenfolge Argument setzen:Dies sollte hilfreich sein, wenn Sie es auch mit anderen Funktionen von kombinieren müssen
[[ ]]
.Beenden des Skripts
Es ist auch logisch, das Skript zu beenden, wenn ungültige Parameter an das Skript übergeben werden. Dies wurde bereits in den Kommentaren von ekangas vorgeschlagen, aber jemand hat diese Antwort bearbeitet, um sie
-1
als Rückgabewert zu verwenden, also könnte ich es genauso gut richtig machen.-1
Obwohl von Bash als Argument akzeptiert,exit
ist dies nicht explizit dokumentiert und kann nicht als allgemeiner Vorschlag verwendet werden.64
ist auch der formalste Wert, da er insysexits.h
mit definiert ist#define EX_USAGE 64 /* command line usage error */
. Die meisten Tools gebenls
auch2
ungültige Argumente zurück. Ich habe auch2
in meinen Skripten zurückgegeben, aber in letzter Zeit habe ich mich nicht mehr wirklich darum gekümmert und einfach bei1
allen Fehlern verwendet. Aber lassen Sie uns einfach2
hier platzieren, da es am häufigsten und wahrscheinlich nicht betriebssystemspezifisch ist.Verweise
quelle
[
nur ein weiterer Befehl ist, dh versuchen Sie eswhich [
.[
ist ein eingebautes, während[[
ein Schlüsselwort ist. In einigen älteren Muscheln[
ist nicht einmal eingebaut. Befehle wie[
natürlich existieren in den meisten Systemen als externer Befehl nebeneinander, aber interne Befehle werden von der Shell priorisiert, sofern Sie nicht mitcommand
oder umgehenexec
. Überprüfen Sie in der Dokumentation der Shell, wie sie bewertet wird. Beachten Sie ihren Unterschied und wie sie sich in jeder Schale unterschiedlich verhalten können.Es könnte eine gute Idee sein, arithmetische Ausdrücke zu verwenden, wenn Sie mit Zahlen arbeiten.
quelle
[ ... ]
wenn dies einwandfrei funktioniert und keine ausgefallenen Operationen erforderlich sind?$(( ))
sind nichts Besonderes und sollten von allen POSIX-Shells implementiert werden. Die(( ))
Syntax (ohne$
) ist jedoch nicht Teil davon. Wenn Sie aus irgendeinem Grund eingeschränkt sind, können Sie sicherlich[ ]
stattdessen verwenden, aber denken Sie daran, dass Sie dann auch nicht verwenden sollten[[ ]]
. Ich hoffe, Sie verstehen die Fallstricke[ ]
und Gründe, warum diese Funktionen existieren. Da dies jedoch eine Bash-Frage war, geben wir Bash-Antworten ( „Als Faustregel wird [[für Zeichenfolgen und Dateien verwendet. Wenn Sie Zahlen vergleichen möchten, verwenden Sie einen ArithmeticExpression“ ).On [] :! =, =, == ... sind String- Vergleichsoperatoren und -eq, -gt ... sind arithmetische binäre.
Ich würde ... benutzen:
Oder:
quelle
==
ist eigentlich eine undokumentierte Funktion, die zufällig mit GNU funktionierttest
. Es ist auch geschieht mit FreeBSD zu arbeitentest
, sondern kann auf nicht funktionieren footest
. Der einzige Standardvergleich ist=
(nur zu Ihrer Information).dash
:dash -c '[ 1 == 1 ]'
. POSIX gibt nur an=
und nicht==
.Wenn Sie nur dann gegen Kaution gehen möchten, wenn ein bestimmtes Argument fehlt, ist die Parametersubstitution großartig:
quelle
Ein einfacher Einzeiler, der funktioniert, kann verwendet werden mit:
Dies gliedert sich in:
Denkt zu beachten:
quelle
exit 1
dies nur für den Kontext der Unterschale gelten würde, was es auch nur bedeutet( usage; false )
. Ich bin kein Fan dieser Art der Vereinfachung, wenn es um das Parsen von Optionen geht, aber Sie können{ usage && exit 1; }
stattdessen verwenden. Oder wahrscheinlich nur{ usage; exit 1; }
.{...}
ist eine gängige Syntax und steht den meisten, wenn nicht allen Shells zur Verfügung, die darauf basierensh
, auch den älteren Shells, die nicht den POSIX-Standards entsprechen.Überprüfen Sie dies Bash-Cheatsheet an, es kann viel helfen.
Um die Länge der übergebenen Argumente zu überprüfen, verwenden Sie
"$#"
Um das übergebene Array von Argumenten zu verwenden, verwenden Sie
"$@"
Ein Beispiel für das Überprüfen der Länge und das Iterieren wäre:
Dieser Artikel half mir, aber es fehlten ein paar Dinge für mich und meine Situation. Hoffentlich hilft das jemandem.
quelle
Wenn Sie auf der sicheren Seite sein möchten, empfehle ich die Verwendung von getopts.
Hier ist ein kleines Beispiel:
Weitere Details finden Sie hier, zum Beispiel http://wiki.bash-hackers.org/howto/getopts_tutorial
quelle
Hier ein einfacher Einzeiler, um zu überprüfen, ob nur ein Parameter angegeben ist. Andernfalls beenden Sie das Skript:
quelle
Sie sollten Leerzeichen zwischen den Testbedingungen einfügen:
Ich hoffe das hilft.
quelle