2017-12-15 10 views
0

Ich verwende die unten, wenn Bedingung, um eine Aufgabe in meinem Skript zu tun, aber es ist nicht funktioniert wie erwartet. Kann mir bitte jemand sagen, ob ich falsch liege?Wenn Bedingung nicht funktioniert in Unix

if [ `whoami` != 'user1' ]|[ `whoami` != 'user2' ]; then 
    echo "Must run this script as user1 or user2." 
    exit 
else 
    do something 
fi 

Antwort

0

die beiden Bedingungen Kombinieren -a ("Benutzer ist nicht user1 und Benutzer ist nicht user2") mit:

if [ `whoami` != 'user1' -a `whoami` != 'user2' ]; then 

man test Siehe für weitere Informationen. Beachten Sie, dass test a.k.a. in die Bash-Shell integriert ist, anstatt eine separate Binärdatei zu sein, so dass es auch irgendwo in man bash vergraben ist.

2
[ `whoami` != 'user1' ]|[ `whoami` != 'user2' ] 

so verwenden Sie den [ Test-Befehl, der wahr oder falsch zurückgibt und keine Leistung abgibt, und dann Rohrleitungen die leere Ausgabe andere[ Test.

Der Rückgabestatus einer Pipeline ist nur das Ergebnis des Befehls letzten. Also, das ist äquivalent zu

[ `whoami` != 'user2' ] 

Was wollten Sie war vielleicht

[ (`whoami` != 'user1') -a (`whoami` != 'user2') ] 

, die ein einzelner Test-Befehl mit einem boolean und.

(Ihr Code sieht mehr, wie es eine logische oder sein sollte, aber das ist nicht die Programmlogik übereinstimmt).


Lauf whoami zweimal scheint nicht notwendig - der Wert bereits in $USER sein kann, aber wenn Sie wollen, dass nicht vertrauen, könnten Sie wahrscheinlich Ihren Code in so etwas wie

case $(whoami) in 
user1|user2) ;; # OK - continue below esac 
*) echo "Must run this script as user1 or user2." 
    exit ;; 
esac 
# do something 
+0

Refactoring Ich bin ziemlich sicher, dass OP Boolean UND statt OR wollte. Sonst kann dies niemals falsch werden. – Thomas

+0

Ja, ich lese gerade die Frage neu und erkannte, dass ich von der Annahme, dass '|' als '||' gedacht war, ausging. – Useless

Verwandte Themen