Pregunta

Estoy buscando el bucle básico como:

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

pero para bash.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top