Für Schleife mit Bedingungen

1

Ich habe ein Skript, das Benutzer auf vielen Servern hinzufügt. Da ich viele Server hinzufüge, verwende ich for loop.

Unten sehen Sie die Ausgabe, wenn der Benutzer erfolgreich hinzugefügt wurde.

0,22529,User added.

Wenn der Benutzer nicht hinzugefügt wird, erhalte ich diese Fehlermeldung

1,23996,CLI failed to connect to database.

ODER

1,22560,The current state of the server does not allow this action.

script Begin

read user
echo -e '\E[32;40m'"\033[1mPlease wait .... adding id on all server\033[0m"
PORT=777
USER=User
PASSWORD=****
for server in server1.abc.com server2.abc.com 
do
command // to add user 
done

Script end

Ich möchte das Echo von sowohl Benutzer hinzugefügt als auch Benutzer nicht hinzugefügt, basierend auf der für die Schleife übergebenen Serverliste.

Z.B.

User added in server1.abc.com
user failed to add in server2.abc.com

Jede Hilfe hierzu wäre sehr dankbar.

maneeshshetty
quelle

Antworten:

1

Wenn Sie die Standardausgabe eines bestimmten Befehls verwenden möchten, können Sie die Befehlssubstitution verwenden und in a einschließen $(…).

Wir können mit dem =~in Bash 3 und höher eingeführten Operator überprüfen, ob die Ausgabe einem bestimmten regulären Ausdruck entspricht . Wenn der reguläre Ausdruck übereinstimmt, gibt der Test true zurück, sodass wir danach einen weiteren Befehl ausführen können &&. Wenn dies nicht der Fall ist, gibt der Test false zurück und die nachfolgenden Befehle ||werden ausgeführt.

Da wir prüfen wollen, ob die Ausgabe das Wort enthält added, reicht Folgendes aus:

for server in server1.abc.com server2.abc.com 
do
  [[ "$(command)" =~ added ]] \
    && echo "User ${user} added in ${server}" \
    || echo "User ${user} failed to add in ${server}"
done

In Ihrem Skript sollten Sie ändern USERzu user, da $USEReine globale Umgebungsvariable Ihren Benutzernamen trägt , ist. Versuchen Sie echo $USERvon Ihrer Kommandozeile aus zu sehen, was ich meine.

slhck
quelle
ja, es wird generell empfohlen, Variablennamen in Kleinbuchstaben zu verwenden, damit Sie nicht versehentlich bash-Variablen überschreiben.
Glenn Jackman
Gern geschehen, @maneeshshetty. Wussten Sie, dass die Super-User-Art, sich zu bedanken, darin besteht, Antworten abzustimmen, die Sie für nützlich hielten? Ich sehe, Sie haben noch keine Stimmen abgegeben. Klicken Sie einfach auf den Pfeil nach oben neben der Punktzahl. Es dauert nur eine Sekunde - aber auf diese Weise zahlen Sie es an andere weiter.
Slhck
Ich wusste das nicht, ich habe das einfach getan! :-)
maneeshshetty
1
for server in ...; do
    command | while IFS=, read exitstatus id message; do
        if [[ $exitstatus == "0" ]]; then
            echo "User added on $server"
        else
            echo "Failed to add user on $server: $message"
        fi
    done
done

Überprüfen Sie jedoch den tatsächlichen Exit-Status von command- Gibt es bei einem Fehler einen Exit-Status ungleich Null zurück?

for server in ...; do
    if output=$(command); then
        echo "User added on $server"
    else
        echo "Failed to add user on $server: $output"
    fi
done
Glenn Jackman
quelle
Hatte nicht daran gedacht read, die Variablen dort zu verwenden und zuzuweisen, nett.
Slhck