Estoy buscando el bucle básico como:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
pero para bash.
Estoy buscando el bucle básico como:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
pero para bash.
Respuestas:
De este sitio :
for i in $(seq 1 10);
do
echo $i
done
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
ArrayLength=${#array[@]}
¿cómo la usamos aquí en lugar de max
?
El bash for
consiste en una variable (el iterador) y una lista de palabras donde el iterador, bueno, iterará.
Entonces, si tiene una lista limitada de palabras, simplemente colóquelas en la siguiente sintaxis:
for w in word1 word2 word3
do
doSomething($w)
done
Probablemente desee iterar a lo largo de algunos números, por lo que puede usar el seq
comando para generar una lista de números para usted: (de 1 a 100 por ejemplo)
seq 1 100
y utilícelo en el bucle FOR:
for n in $(seq 1 100)
do
doSomething($n)
done
Tenga en cuenta la $(...)
sintaxis. Es un comportamiento bash, le permite pasar la salida de un comando (en nuestro caso desde 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.
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 seq 1 10
).
Por supuesto, esto tiene el mismo problema que la for(())
solución, está vinculado a bash e incluso a una versión en particular (si esto te importa).
Prueba la bash
ayuda incorporada:
$ 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.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
Aquí hay un ejemplo que también puede funcionar en shells más antiguos, sin dejar de ser eficiente para grandes recuentos:
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
Pero buena suerte haciendo cosas útiles dentro de awk
: ¿Cómo uso las variables de shell en un script awk?
do
/ done
par.
Por lo general, me gusta usar una ligera variante del estándar for 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 for que me permiten crear bucles for no numéricos.
Ejemplo:
Quiero ejecutar el comando de tiempo de actividad en los hosts frontend 1-5 y los hosts 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 al final 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} post resultados en prefoopost, prebarpost) y permitir el conteo / secuencias mediante el uso de puntos dobles (puede usar un. .z etc.). Sin embargo, la sintaxis de doble período es una nueva característica de bash 3.0; las versiones anteriores no lo admitirán.
si solo está interesado en bash, la solución "for ((...))" presentada anteriormente es la mejor, pero si desea algo compatible con POSIX SH que funcione en todos los sistemas, tendrá que usar "expr" y "while", y eso se debe a que "(())" o "seq" o "i = i + 1" no son tan portátiles entre varios shells
Utilizo variaciones de esto todo el tiempo para procesar archivos ...
para archivos en * .log; hacer eco "Hacer cosas con: $ archivos"; echo "Hacer más cosas con: $ archivos"; hecho;
Si lo que le interesa es procesar listas de archivos, busque los archivos en la opción -execdir .