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