Bash wenn in einer Zeile

50

Ich würde gerne wissen, wie ich schreiben kann, wenn Bedingungen innerhalb eines Bash-Skripts in einer einzelnen Zeile stehen.

Wie kann ich dies beispielsweise in eine einzelne Zeile schreiben und dann eine weitere Zeile wie diese in die nächste Zeile einfügen?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

Ich frage dies, weil ich einige Aliase in meiner .bashrc habe und auf mehreren Systemen dieselbe .bashrc (synchronisiert) habe, aber ich brauche nicht alle Aliase auf jedem System. Ich habe die meisten von ihnen in if-Anweisungen eingefügt, und jetzt funktioniert alles wunderbar, aber sie nehmen viel Platz ein, jeweils 3 Zeilen plus die leere Zeile zwischen ihnen (ich mag es, wenn sie leicht sichtbar sind).

Ich werde diese Technik auch für Umgebungsvariablen verwenden.

Horațiu Mlendea
quelle
4
Sie können auch schreiben[ -f "/usr/bin/wine" ] && export WINEARCH=win32
Glenn Jackman
3
Denken Sie daran, dass kürzer nicht unbedingt besser ist. Mit den Logikoperatoren der Shell können subtile Logikfehler auftreten. Wählen Sie aus, was einfacher zu lesen und zu warten ist.
Glenn Jackman

Antworten:

83

Sie würden es als solches schreiben:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

Beachten Sie, dass dies auch geschrieben werden kann (wie von @glennjackman vorgeschlagen):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32
DR_
quelle
1
Nun, das war einfach ... :) Jetzt ist es mir irgendwie unangenehm, das zu fragen. Vielen Dank für die Antwort, es hat sehr geholfen!
Horațiu Mlendea
7
Es gibt einen Unterschied. 1. Der Ausdruck wird mit dem Status 0 beendet. 2. Der Ausdruck wird mit dem Status Nicht 0 beendet, wenn die Datei nicht vorhanden ist. Dies kann einen Unterschied machen, wenn Sie dies in einigen automatisierten Aufgaben wie der Bereitstellung verwenden, bei denen der Erfolg einer Aufgabe vom Beendigungsstatus des Befehls abhängt.
Jānis Gruzis
@ HorațiuMlendea offensichtlich war es einfach. wenn du weißt wie. Aber die Syntax ist fummelig, zB [1 == 1] ist ein Fehler, aber [1 == 1] funktioniert. Und die Semikolons. Wie können Sie sich unbehaglich fühlen, wenn Sie eine fummelig schlecht gestaltete Syntax nicht kennen? Dein 'Gefühl' macht überhaupt keinen Sinn. Dies war eine nützliche Frage, auch wenn Sie leider nicht verstehen, warum.
Barlop
@balop nein, ich verstehe total was du meinst und ich stimme zu. Es ist nur so, dass ich zu der Zeit die einzelnen Bits verstanden habe, aus denen diese Syntax bestand (die mit &&). Normalerweise ist es einfach und intuitiv, Dinge zusammenzusetzen, aber wie Sie sagten, ist diese Sprache ziemlich fummelig und nicht sehr intuitiv.
Horațiu Mlendea
4

Ich finde auch, dass ich einfach einen komplexen if-else-Befehl eingebe, die Eingabetaste drücke und nach der Ausführung einfach den Aufwärtspfeil drücke. Die Befehlszeile wiederholt natürlich den zuletzt eingegebenen Befehl, aber in diesem Fall wird alles nach Bedarf in einer Zeile zusammengefasst. Es ist ein betrügerischer Weg, aber es ist effektiv.

Alan
quelle
5
Beachten Sie, dass dies möglicherweise von Ihrer Shell abhängt (und möglicherweise auch von den Einstellungen Ihrer Shell). Einige schnelle Tests auf meinem Computer zeigen, dass dies in Bash funktioniert (also +1), aber Zsh behält die Zeilenumbrüche bei, wenn Sie zu vorherigen Befehlen zurückkehren.
8bittree