Pregunta Para bucle con condiciones


Tengo un script que agrega usuarios en muchos servidores. Como estoy agregando muchos servidores, estoy usando for loop.

A continuación se muestra el resultado cuando el usuario se agrega con éxito.

0,22529,User added.

Si el usuario no se agrega, entonces obtengo este error

1,23996,CLI failed to connect to database.

O

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

Deseo un eco del usuario agregado y del usuario no agregado en función de la lista del servidor aprobada para el ciclo.

P.ej.

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

Cualquier ayuda sobre esto sería muy apreciada.


0


origen




Respuestas:


Si desea utilizar la salida estándar de un determinado comando, puede usar sustitución de comando y envolverlo dentro de una $(…).

Podemos verificar si la salida se ajusta a una cierta expresión regular con el =~ operador introducido en Bash 3 y superior. Si la expresión regular coincide, la prueba será verdadera, por lo que podemos ejecutar otro comando después &&. Si no coincide, la prueba devolverá falso, y los comandos después || son ejecutados.

Como queremos verificar si el resultado contiene la palabra added, lo siguiente es suficiente

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

En tu script debes cambiar USER a user, ya que $USER es una variable de entorno global con tu nombre de usuario. Prueba correr echo $USER desde tu línea de comando para ver a qué me refiero.


1



sí, generalmente se recomienda usar nombres de variables en minúsculas, para que no sobrescriba accidentalmente las variables de bash. - glenn jackman
De nada, @maneeshshetty. ¿Sabía que la manera de Super User de decir "gracias" es votar las respuestas que le parecieron útiles? Veo que aún no has votado. Simplemente haga clic en la flecha de votación al lado de su puntaje. Solo lleva un segundo, pero de esta forma se lo pagará a otros. - slhck
¡No lo sabía, solo lo hice! :-) - maneeshshetty


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

Sin embargo, verifique el estado de salida real de command - ¿Devuelve un estado de salida distinto de cero para la falla?

for server in ...; do
    if output=$(command); then
        echo "User added on $server"
    else
        echo "Failed to add user on $server: $output"
    fi
done

1



No había pensado en usar read y asignando las variables allí, agradable. - slhck