Wenn Ihre Eingabeoptionen positionell sind (Sie wissen, an welchen Stellen sie sich befinden) und nicht mit Flags angegeben sind, möchten Sie lediglich die Befehlszeile erstellen. Bereiten Sie einfach die Befehlsargumente für alle vor:
FLAG1="--flag1 $1"
FLAG2="--flag2 $2"
OPTFLAG1=""
OPTFLAG2=""
OPTFLAG3=""
if [ xFALSE != x"$3" ]; then
OPTFLAG1="--optflag1 $3"
fi
if [ xFALSE != x"$4" ]; then
OPTFLAG2="--optflag2 $4"
fi
#the same for other flags
#now just run the program
runprogram $FLAG1 $FLAG2 $OPTFLAG1 $OPTFLAG2 $OPTFLAG3
Wenn die Parameter nicht angegeben werden, sind die entsprechenden Zeichenfolgen leer und werden zu nichts erweitert. Beachten Sie, dass in der letzten Zeile keine Anführungszeichen stehen. Das liegt daran, dass die Shell die Parameter in Wörter aufteilen soll (geben --flag1
und$1
als separate Argumente für Ihr Programm). Dies geht natürlich schief, wenn Ihre ursprünglichen Parameter Leerzeichen enthalten. Wenn Sie derjenige sind, der dies ausführt, können Sie es verlassen. Wenn es sich jedoch um ein allgemeines Skript handelt, kann es zu unerwartetem Verhalten kommen, wenn der Benutzer etwas mit Leerzeichen eingibt. Um damit umzugehen, müssen Sie den Code etwas hässlicher machen.
Das x
Präfix im []
Test ist für den Fall vorhanden $3
oder $4
leer. In diesem Fall würde bash erweitern [ FALSE != $3 ]
in[ FALSE != ]
dem ein Syntaxfehler, so ein weiteres beliebige Zeichen gibt es gegen diese zu schützen. Dies ist eine sehr häufige Methode, die Sie in vielen Skripten sehen werden.
Ich habe OPTFLAG1
und der Rest von ihnen zu ""
Beginn eingestellt, nur um sicherzugehen (falls sie zuvor auf etwas eingestellt waren), aber wenn sie nicht tatsächlich in der Umgebung deklariert wurden, müssen Sie dies nicht unbedingt tun.
Ein paar zusätzliche Bemerkungen:
- Sie können die Parameter tatsächlich genauso empfangen wie
runprogram
mit Flags. Darum geht John N
es. Dort getopts
wird es nützlich.
- Die Verwendung von FALSE für diesen Zweck ist etwas unstandardisiert und ziemlich lang. Normalerweise würde man ein einzelnes Zeichen (möglicherweise
-
) verwenden, um einen leeren Wert zu signalisieren, oder einfach eine leere Zeichenfolge übergeben ""
, wenn dies ansonsten kein gültiger Wert des Parameters ist. Leere Zeichenfolge macht den Test auch kürzer, verwenden Sie einfachif [ -n "$3" ]
.
- Wenn es nur ein optionales Flag gibt oder wenn diese abhängig sind, sodass Sie niemals OPTFLAG2, aber nicht OPTFLAG1 haben können, können Sie einfach diejenigen überspringen, die Sie nicht setzen möchten. Wenn Sie
""
leere Parameter verwenden, wie oben vorgeschlagen, können Sie trotzdem alle nachgestellten Leergut überspringen.
Diese Methode ist so ziemlich die Art und Weise, wie Optionen an Compiler in Makefiles übergeben werden.
Und wieder - wenn Eingaben Leerzeichen enthalten können, wird es hässlich.
getopts
ist was du willst. Ohne dies könnten Sie eine Schleife mit einer switch-Anweisung verwenden, um jedes optionale oder nicht optionale Flag zu erkennen.