473 Stimmen

Wie macht man eine "if not true"-Bedingung?

Ich möchte gerne die echo Befehl ausgeführt, wenn cat /etc/passwd | grep "sysa" ist nicht wahr.

Was mache ich falsch?

if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi

656voto

shellter Punkte 34982

Versuchen Sie

if ! grep -q sysa /etc/passwd ; then

grep gibt zurück. true wenn es das Suchziel findet, und false wenn nicht.

Also NICHT falsch ( ! false ) == true .

if Die Auswertung in Shells ist sehr flexibel gestaltet und erfordert oft keine Befehlsketten (wie Sie geschrieben haben).

Wenn man sich Ihren Code so ansieht, ist die Verwendung der $( ... ) Form der cmd-Substitution ist lobenswert, aber denken Sie daran, was dabei herauskommt. Versuchen Sie echo $(cat /etc/passwd | grep "sysa") um zu sehen, was ich meine. Sie können das weiter ausbauen, indem Sie die -c (count) an grep an und machen dann if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then die zwar funktioniert, aber ziemlich altmodisch ist.

ABER, Sie könnten die neuesten Shell-Funktionen (arithmetische Auswertung) verwenden wie

if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`

die Ihnen auch den Vorteil bietet, die auf C-Lang basierenden Vergleichsoperatoren zu verwenden, ==,<,>,>=,<=,% und vielleicht noch ein paar andere.

In diesem Fall kann die arithmetische Auswertung gemäß einem Kommentar von Orwellophile noch weiter vereinfacht werden, etwa so

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....

OR

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....

Schließlich gibt es eine Auszeichnung genannt die Useless Use of Cat (UUOC) . :-) Einige Leute werden aufspringen und Gothca schreien! Ich werde einfach sagen, dass grep kann einen Dateinamen in der cmd-Zeile annehmen. Warum also zusätzliche Prozesse und Pipe-Konstruktionen aufrufen, wenn es nicht nötig ist? ;-)

Ich hoffe, das hilft.

45voto

Tareq Punkte 319

Diese

if [[ !  $(cat /etc/passwd | grep "sysa") ]]; then
  echo " something"
  exit 2
fi

39voto

Rony Punkte 1644

Ich denke, das kann man vereinfacht sagen:

grep sysa /etc/passwd || {
    echo "ERROR - The user sysa could not be looked up"
    exit 2
}

oder in einer einzigen Befehlszeile

$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }

11voto

phil294 Punkte 9218

Was mache ich falsch?

$(...) hält die Wert und nicht den Exit-Status, weshalb dieser Ansatz falsch ist. In diesem speziellen Fall funktioniert er jedoch tatsächlich, weil sysa wird gedruckt, wodurch die Testaussage wahr wird. Allerdings, if ! [ $(true) ]; then echo false; fi würde immer drucken false weil die true Befehl schreibt nichts nach stdout (auch wenn der Exit-Code 0 ist). Deshalb muss er umformuliert werden in if ! grep ...; then .

Eine Alternative wäre cat /etc/passwd | grep "sysa" || echo error . Edit: Wie Alex schon sagte, Katze ist hier nutzlos : grep "sysa" /etc/passwd || echo error .

Ich fand die anderen Antworten eher verwirrend, ich hoffe, das hilft jemandem.

5voto

Mario Palumbo Punkte 429

Einfach:

if ! examplecommand arg1 arg2 ...; then
    #code block
fi

ohne jegliche Klammern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X