while script loop for example else bash iterator

script - sleep bash



Cómo escribo un bucle for en bash (9)

Estoy buscando el bucle básico como:

for(int i = 0; i < MAX; i++) { doSomething(i); }

pero por bash.


Bash 3.0+ puede usar esta sintaxis:

for i in {1..10} ; do ... ; done

..que evita generar un programa externo para expandir la secuencia (como la secuencia seq 1 10 ).

Por supuesto, esto tiene el mismo problema que la solución de for(()) , estar vinculado a bash e incluso a una versión en particular (si esto te importa).


Comúnmente me gusta usar una pequeña variante en el estándar para loop. A menudo uso esto para ejecutar un comando en una serie de hosts remotos. Aprovecho la expansión de llaves de bash para crear bucles que me permiten crear bucles foráneos no numéricos.

Ejemplo:

Quiero ejecutar el comando uptime en los servidores frontend 1-5 y los servidores backend 1-3:

% for host in {frontend{1..5},backend{1..3}}.mycompany.com do ssh $host "echo -n $host; uptime" done

Normalmente ejecuto esto como un comando de una sola línea con punto y coma en los extremos de las líneas en lugar de la versión más legible anterior. La consideración clave del uso es que las llaves le permiten especificar múltiples valores para ser insertados en una cadena (por ejemplo, pre {foo, bar} publicar resultados en prefoopost, prebarpost) y permitir contar / secuencias usando los períodos dobles (puede usar a. .z etc.). Sin embargo, la sintaxis de doble período es una nueva característica de bash 3.0; las versiones anteriores no son compatibles con esto.


Desde este sitio :

for i in $(seq 1 10); do echo $i done


El bash for consiste en una variable (el iterador) y una lista de palabras donde el iterador, bueno, iterará.

Entonces, si tienes una lista limitada de palabras, simplemente ponlas en la siguiente sintaxis:

for w in word1 word2 word3 do doSomething($w) done

Probablemente quiera iterar a lo largo de algunos números, por lo que puede usar el comando seq para generar una lista de números para usted: (de 1 a 100, por ejemplo)

seq 1 100

y usarlo en el ciclo FOR:

for n in $(seq 1 100) do doSomething($n) done

Tenga en cuenta la sintaxis $(...) . Es un comportamiento bash, te permite pasar la salida de un comando (en nuestro caso de seq ) a otro (el for )

Esto es realmente útil cuando tiene que iterar sobre todos los directorios en alguna ruta, por ejemplo:

for d in $(find $somepath -type d) do doSomething($d) done

Las posibilidades son infinitas para generar las listas.


Pruebe la ayuda integrada de bash :

$ help for for: for NAME [in WORDS ... ;] do COMMANDS; done The `for'' loop executes a sequence of commands for each member in a list of items. If `in WORDS ...;'' is not present, then `in "$@"'' is assumed. For each element in WORDS, NAME is set to that element, and the COMMANDS are executed. for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done Equivalent to (( EXP1 )) while (( EXP2 )); do COMMANDS (( EXP3 )) done EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is omitted, it behaves as if it evaluates to 1.


Uso variaciones de esto todo el tiempo para procesar archivos ...

para archivos en * .log; hacer eco "Hacer cosas con: $ archivos"; echo "Haz más cosas con: $ files"; hecho;

Si lo que le interesa es procesar listas de archivos, consulte la opción -execdir para ver los archivos .


si está solo interessado en bash, la solución "for ((...))" presentada anteriormente es la mejor, pero si quiere algo compatible con POSIX SH que funcione en todos los equipos, tendrá que usar "expr" y "while", y eso es porque "(())" o "seq" o "i = i + 1" no son tan portátiles entre varias conchas


#! /bin/bash function do_something { echo value=${1} } MAX=4 for (( i=0; i<MAX; i++ )) ; { do_something ${i} }


for ((i = 0 ; i < max ; i++ )); do echo "$i"; done