Ladebedingung innerhalb der Ausführungszeile in Bash

Ladebedingung innerhalb der Ausführungszeile in Bash

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 $variableLeerzeichen 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 $variablenicht leer ist, fügen wir -optionund $variablean das Array an opts.

  • command ... "${opts[@]}"

    Dies führt Ihren Befehl aus. Wenn optsnicht leer ist, werden seine Elemente dem Befehl hinzugefügt. Wenn optsleer 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.

verwandte Informationen