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

3voto

SDsolar Punkte 2089

Hier ein Beispiel für eine Antwort:

Um sicherzustellen, dass die Datenlogger online sind, muss ein cron Skript wird alle 15 Minuten ausgeführt und sieht wie folgt aus:

#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
  echo "SUBJECT:  SOLAR is not responding to ping" | ssmtp abc@def.com
  echo "SOLAR is not responding to ping" | ssmtp 4151112222@txt.att.com
else
  echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
  echo "SUBJECT:  OUTSIDE is not responding to ping" | ssmtp abc@def.com
  echo "OUTSIDE is not responding to ping" | ssmtp 4151112222@txt.att.com
else
  echo "OUTSIDE is up"
fi
#

...und so weiter für jeden Datenlogger, den Sie in der Montage sehen können unter http://www.SDsolarBlog.com/montage


Zu Ihrer Information: Mit &>/dev/null leitet alle Ausgaben des Befehls, einschließlich Fehler, an /dev/null

(Die Bedingung erfordert nur die exit status der ping Befehl)

Außerdem ist zu beachten, dass seit cron Aufträge laufen als root ist es nicht erforderlich, die sudo ping in einem cron Drehbuch.

2voto

Kusalananda Punkte 13612

Auf Unix-Systemen, die es unterstützen (nicht macOS, wie es scheint):

if getent passwd "$username" >/dev/null; then
    printf 'User %s exists\n' "$username"
else
    printf 'User %s does not exist\n' "$username"
fi 

Dies hat den Vorteil, dass jeder Verzeichnisdienst (YP/NIS oder LDAP usw.) und die lokale Kennwortdatenbankdatei abgefragt werden können.


Das Problem mit grep -q "$username" /etc/passwd ist, dass es ein falsches Positiv gibt, wenn es keinen solchen Benutzer gibt, aber etwas anderes dem Muster entspricht. Dies kann passieren, wenn es irgendwo in der Datei eine teilweise oder genaue Übereinstimmung gibt.

Zum Beispiel, in meinem passwd Datei gibt es eine Zeile, die besagt

build:*:21:21:base and xenocara build:/var/empty:/bin/ksh

Dies würde eine gültige Übereinstimmung bei Dingen wie cara et enoc usw., obwohl es in meinem System keine solchen Benutzer gibt.

Für eine grep Lösung korrekt zu sein, müssen Sie die /etc/passwd Datei:

if cut -d ':' -f 1 /etc/passwd | grep -qxF "$username"; then
    # found
else
    # not found
fi

... oder eine andere ähnliche Prüfung gegen den ersten der : -begrenzte Felder.

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