¿Cómo puedo escribir un bucle for en bash
Pregunta
Estoy buscando el bucle básico como:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
pero para bash.
Solución
De este sitio:
for i in $(seq 1 10);
do
echo $i
done
Otros consejos
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
El bash for
consiste en una variable (el iterador) y una lista de palabras donde el iterador de la voluntad, bien, iterar.
Por lo tanto, si usted tiene una lista limitada de palabras, basta con ponerlos en la siguiente sintaxis:
for w in word1 word2 word3
do
doSomething($w)
done
Probablemente usted desea recorrer a lo largo de algunos de los números, así que usted puede utilizar el seq
comando para generar una lista de números para usted:(de 1 a 100, por ejemplo)
seq 1 100
y utilizarlo en el bucle FOR:
for n in $(seq 1 100)
do
doSomething($n)
done
Nota la $(...)
la sintaxis.Es un golpe de comportamiento, que le permite pasar a la salida de un comando (en nuestro caso de seq
) a otro (el for
)
Esto es realmente útil cuando usted tiene que iterar sobre todos los directorios en algunos ruta, por ejemplo:
for d in $(find $somepath -type d)
do
doSomething($d)
done
Las posibilidades son infinitas para generar las listas.
Bash 3.0+ puede utilizar esta sintaxis:
for i in {1..10} ; do ... ; done
..lo que evita el desove de un programa externo para expandir la secuencia (como seq 1 10
).
Por supuesto, esto tiene el mismo problema que el de la for(())
la solución, de ser atado a bash e incluso una versión particular (si te interesa).
Pruebe el bash
construido-en la ayuda:
$ 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.
Me comúnmente como el uso de una ligera variante en el estándar para el bucle.A menudo utilizo esta para ejecutar un comando en una serie de hosts remotos.Aprovecho de bash llave de expansión para crear bucles for que me permiten crear no numéricos para los bucles.
Ejemplo:
Quiero correr el tiempo de actividad de comandos en la interfaz de los ejércitos 1-5 y backend hosts 1-3:
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
Me suelen ejecutar esto como una sola línea de comando con punto y coma en los extremos de las líneas en lugar de la versión más legible arriba.El uso de clave de consideración, es que los apoyos permiten especificar varios valores para insertarse en una cadena (por ejemplo,pre{foo,bar}publicar los resultados en prefoopost, prebarpost) y permitir contar/secuencias utilizando el doble de puntos (se puede utilizar a..z, etc.).Sin embargo, el período doble sintaxis es una nueva característica de bash 3.0;las versiones anteriores no soportan.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
He aquí un ejemplo que puede trabajar también en mayores conchas, sin dejar de ser eficiente para la gran cuenta:
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
Pero la buena suerte de hacer cosas útiles en el interior de awk
: ¿Cómo puedo utilizar las variables de shell en un guión awk?
si estás intereased sólo en bash, el "por(( ...))" solución presentada es el mejor, pero si quieres algo POSIX SH compatible con que va a trabajar en todos los sistemas unix que usted tendrá que usar "expr" y "mientras que", y eso es porque "(())" o "ss" o "i=i+1" no son portables entre diferentes conchas
Yo uso las variaciones de esto todo el tiempo para procesar los archivos...
para los archivos en *.de registro;do echo "Hacer cosas con:$files";echo "Hacer más cosas con:$files";hecho;
Si el procesamiento de las listas de archivos es lo que usted está interesado en, buscar en los -execdir opción para los archivos.