Bedingung innerhalb der Ausführungszeile in Bash laden

378
Juan

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. Wenn nicht, laden Sie diese Option nicht. Das ist was ich habe:

if [ -n "$variable" ] then command ... -option $variable else command ... fi 

Die Idee wäre, diesen Befehl mit der Bedingung innerhalb eines einzigen Befehls zusammenzuführen, damit ich die anderen Optionen des Befehls nicht zweimal wiederholen muss.

Vielen Dank für Ihre Zeit.

1
Ich habe eine einfachere Lösung als die, die Sie akzeptiert haben, bitte schauen Sie sich diese an. Prost. MariusMatutiae vor 7 Jahren 0

4 Antworten auf die Frage

1
John1024

Bash-Arrays verwenden:

opts=() [ "$variable" ] && opts+=(-option "$variable") command ... "$" 

Da dies Bash-Arrays verwendet, funktioniert dies auch, wenn $variableLeerzeichen oder andere schwierige Zeichen enthalten sind.

Wie es funktioniert

  • opts=()

    Dadurch wird ein leeres Array erstellt opts.

  • [ "$variable" ] && opts+=(-option "$variable")

    Wenn $variablenicht leer ist, hängen wir -optionund $variablean das Array an opts.

  • command ... "$"

    Dies führt Ihren Befehl aus. Wenn optsnicht leer, werden dessen Elemente zum Befehl hinzugefügt. Wenn optsleer ist, wird nichts hinzugefügt: es wäre so, als wäre "$"es überhaupt nicht da.

Vielen Dank! Es hat wie ein Zauber funktioniert. Nur aus Neugierde, wofür steht das "@"? Juan vor 7 Jahren 0
@Juan Froh, dass es für dich funktioniert hat. Das "@" in "$ " weist bash an, jedes Element von "opts" zu einem separaten Wort zu erweitern. John1024 vor 7 Jahren 0
0
JakeGould

Dann nimm deinen Befehl und mache es zu einer 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 weitergeben.

0
levif

Verwendung heftiger Schlag Substitution ( Shell-Parameter-Expansion ) für eine präzise, noch lesbar Syntax:

$ echo $  $ variable=yes $ echo $ -option yes 
0
MariusMatutiae

Der folgende Einliner wird es tun:

[ x"$VARIABLE" = x ] && echo UNSET || echo SET 

Dies testet, ob die Variable x "$ VARIABLE" gleich x ist, mit anderen Worten, wenn $ VARIABLE leer ist; Wenn der Test erfüllt ist, wird die erste Option ( Echo UNSET ) ausgeführt. Wenn der Test nicht erfüllt ist, wird die letzte Option ausgeführt ( Echo SET ). Wenn Sie im zweiten Fall nichts unternehmen möchten, können Sie dies tun

[ x"$VARIABLE" = x ] && echo UNSET || : 

Dies ist erheblich einfacher als bei den anderen Lösungen, ermöglicht die Bewertung der Bedingung nur einmal und ist robust gegenüber merkwürdigen Zeichen, die in VARIABLE auftreten.