¿Cómo reemplazo AND (&&) en un ciclo for?


24

Me gustaría encontrar un equivalente de

cmd 1 && cmd 2 && ... && cmd 20

pero con comandos expresados ​​dentro de un forciclo como

for i in {1..20}
do
   cmd $i
done

¿Qué sugeriría cambiar en la segunda expresión para encontrar un equivalente de la primera?

Respuestas:


54

El equivalente a su secuencia original sería:

for i in {1..20}
do
   cmd $i || break
done

La diferencia con la respuesta de Amit es que el script no saldrá, es decir, ejecutará comandos potenciales que podrían seguir la secuencia / bucle. Tenga en cuenta que el estado de retorno de todo el ciclo siempre será verdadero con mi sugerencia, esto podría corregirse si es relevante en su caso.


1
De acuerdo, esto sigue más de cerca el comportamiento decmd && cmd
Amit Gold

9

Si desea una solución sucia de una línea, puede crear un comando y enviarlo a bash.

echo "cmd "{1..20}" &&" : | bash

3
deberíamos crear un IObashCC ^^
Olivier Dulac

8

Puede salir del ciclo si uno de ellos falla

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done

1
como señaló @jiliagre (y proporcionó una corrección en su respuesta), esto no "se sale del bucle", sale del shell de llamada.
Olivier Dulac

1
¿No es breaklegal allí? Estoy bastante seguro de que la ifdeclaración no interfiere ..
jpaugh

0

Así es como ejecuto mis tareas en la terminal sin usar &&

 for i in google.com yahoo.com;do ping -c1 $i;echo $i;done

Similar a lo que tiene que poner este comando en un script

 for i in google.com yahoo.com
    do echo $i;ping -c1 $i;
  done

Ambos me dan la misma salida

google.com PING google.com (172.217.26.174) 56 (84) bytes de datos. 64 bytes de google.com (172.217.26.174): icmp_seq = 1 ttl = 56 tiempo = 259 ms

--- estadísticas de ping de google.com --- 1 paquetes transmitidos, 1 recibido, 0% de pérdida de paquetes, tiempo 0 ms rtt min / avg / max / mdev = 259.794 / 259.794 / 259.794 / 0.000 ms yahoo.com PING yahoo.com ( 98.138.253.109) 56 (84) bytes de datos. 64 bytes de yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 tiempo = 398 ms

--- estadísticas de ping de yahoo.com --- 1 paquetes transmitidos, 1 recibido, 0% de pérdida de paquetes, tiempo 0ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.