Ich möchte einen Befehl mit einer Option ausführen, die von der Zuweisung einer Variablen abhängt. Wenn die Variable festgelegt ist, laden Sie die Option mit dem Wert, andernfalls nicht. Das hier habe ich:
if [ -n "$variable" ]
then command ... -option $variable
else command ...
fi
Die Idee wäre, dies zu einem einzigen Befehl mit der darin enthaltenen Bedingung zusammenzuführen, sodass ich die anderen Optionen des Befehls nicht zweimal wiederholen muss.
Vielen Dank für Ihre Zeit.
Antwort1
Verwenden von Bash-Arrays:
opts=()
[ "$variable" ] && opts+=(-option "$variable")
command ... "${opts[@]}"
Da hierbei Bash-Arrays verwendet werden, funktioniert es auch, wenn $variable
Leerzeichen oder andere schwierige Zeichen enthalten sind.
Wie es funktioniert
opts=()
Dadurch wird ein leeres Array mit dem Namen erstellt
opts
.[ "$variable" ] && opts+=(-option "$variable")
Wenn
$variable
nicht leer ist, fügen wir-option
und$variable
an das Array anopts
.command ... "${opts[@]}"
Dies führt Ihren Befehl aus. Wenn
opts
nicht leer ist, werden seine Elemente dem Befehl hinzugefügt. Wennopts
leer ist, wird nichts hinzugefügt: Es wäre, als ob"${opts[@]}"
es überhaupt nicht da wäre.
Antwort2
Nehmen Sie dann Ihren Befehl und machen Sie daraus eine Funktion wie folgt:
function command_function () {
command ... -option $variable
}
if [ -n "$variable" ]
then command_function ... -option $variable
else command_function ...
fi
Nur damit Sie wissen, dass die Klammern in der Bash-Funktion nichts übergeben.
Antwort3
Verwenden vonSchlagSubstitution (Shell-Parameter-Erweiterung) für eine prägnante, dennoch lesbare Syntax:
$ echo ${variable:+-option $variable}
$ variable=yes
$ echo ${variable:+-option $variable}
-option yes
Antwort4
Der folgende Einzeiler reicht aus:
[ x"$VARIABLE" = x ] && echo UNSET || echo SET
Hiermit wird geprüft, ob die Variablex"$VARIABLE"ist gleichX, mit anderen Worten, wenn$VARIABLEist leer. Wenn der Test erfolgreich ist, wird die erste Option (echo NICHT SCHARF) wird ausgeführt, wenn der Testnichterfüllt ist, wird die letzte Option ausgeführt (Echo SET). Wenn Sie im zweiten Fall nichts unternehmen möchten, können Sie
[ x"$VARIABLE" = x ] && echo UNSET || :
Dies ist wesentlich einfacher als die anderen Lösungen, erfordert nur eine einmalige Auswertung der Bedingung und ist robust gegenüber dem Auftreten seltsamer Zeichen in VARIABLE.