2017-01-13 3 views
0

Wenn ich Bash-Skript-Code schaue, sehe ich manchmal | und manchmal siehe ||, aber ich weiß nicht, was vorzuziehen ist.Bash die OR-Operator zu verwenden - Rohr v Doppelrohr

Ich versuche, so etwas wie zu tun .. beraten

set -e; 

ret=0 && { which ansible || ret=$?; } 

if [[ ${ret} -ne 0 ]]; then 
    # install ansible here 
fi 

Bitte die OR-Operator in diesem Szenario bevorzugt.

+4

Sie bedeuten völlig verschiedene Dinge. | ist Rohrleitungsdaten. || ist ein oder. – ceejayoz

+0

Was soll 'set e' tun? – melpomene

+0

https://www.gnu.org/software/bash/manual/bashref.html – melpomene

Antwort

5

| ist überhaupt kein OR-Operator. Sie könnte|| verwenden, aber:

which ansible || { 
    true # put your code to install ansible here 
} 

Dies entspricht einer if entspricht:

if ! which ansible; then 
    true # put your code to install ansible here 
fi 

By the way - betrachten eine Gewohnheit, mit type (ein Shell-builtin) machen anstatt which (ein externer Befehl). type ist sowohl schneller und hat ein besseres Verständnis des Shell-Verhaltens: Wenn Sie einen ansible Befehl haben, der von sagen, eine Shell-Funktion den richtigen Befehl aufgerufen wird, which wird nicht wissen, dass es da ist, aber type wird es korrekt als verfügbar erkennen .

+0

Nun, ich würde sagen, Sie sind zu 100% im Zusammenhang mit der Art, wie es als String-Vergleichsoperator verwendet wird, obwohl das falsche Bash-Handbuch auch angibt, dass es ein ODER-Operator ist. http://www.tldp.org/LDP/abs/html/ops.html –

+1

@ L'l, ... zitieren Sie nicht das ABS bei mir. Finden Sie eine * echte * Referenz (das offizielle Handbuch, das bash-hackers Wiki, etc.). –

+0

Das ist ungültig? Das wusste ich nicht. –

1

Es gibt einen großen Unterschied zwischen der Verwendung einer einzelnen Pipe (Pipe-Ausgabe von einem Befehl, der als Eingabe für den nächsten Befehl verwendet werden soll) und einer Prozesssteuerung OR (Doppelpipeline).

cat /etc/issue | less 

Dies läuft die Katze Befehl auf der Datei/etc/Ausgabe-Datei, und anstatt sofort die Ausgabe sendet es an stdout ist verrohrt der Eingang für den weniger Befehl zu sein. Ja, das ist kein gutes Beispiel ist, da man stattdessen einfach weniger/etc/issue tun könnte - aber zumindest kann man sehen, wie es

touch /etc/testing || echo Did not work 

Für diese Arbeiten wird der Touch-Befehl ausführen, oder versucht, zu rennen. Wenn es einen Nicht-Null-Exit-Status hat, tritt die Doppel-Pipe ODER ein und versucht, den Echo-Befehl auszuführen. Wenn der Touch-Befehl funktioniert hat, wird die andere Wahl (unser Echo-Befehl in diesem Fall) niemals versucht ...