En bash, sé que es posible escribir un forbucle en el que alguna variable de control de bucle iitera sobre enteros específicos. Por ejemplo, puedo escribir un script de shell bash que imprima los enteros entre 1 y 10:
#!/bin/bash
for i in {1..10}
do
echo $i
done
¿Es posible en cambio iterar sobre una variable de control de bucle que es una cadena, si proporciono una lista de cadenas? Por ejemplo, suponga que tengo una cadena fnameque representa un nombre de archivo. Quiero llamar a un conjunto de comandos para cada nombre de archivo. Por ejemplo, podría querer imprimir el contenido del fnameuso de un comando como este:
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
En otras palabras, en la primera iteración, fnamedebe tener el valor fname="a.txt", mientras que en la segunda iteración, fnamedebe tener el valor fname="b.txt", y así sucesivamente. Desafortunadamente, parece que la sintaxis anterior no es del todo correcta. Me gustaría obtener el resultado:
a.txt
b.txt
c.txt
pero cuando pruebo el código anterior, obtengo esta salida:
{a.txt,
b.txt,
c.txt}
¿Puede ayudarme a determinar la sintaxis correcta, para que pueda cambiar iterativamente el valor / contenido de la variable fname? Gracias por tu tiempo.
fuente

{}, no necesita nada para recorrer una lista (delimitada por espacios){}y el,s. La alternativa es eliminar los espacios. Así que, o"a.txt" "b.txt" "c.txt"o{"a.txt","b.txt","c.txt"}. Pero prefiero en su{a..c}.txtlugar.Respuestas:
La sintaxis correcta es la siguiente:
fuente
fnames=( a.txt b.txt c.txt ), puede usar la sintaxisfor f in ${fnames[@]}; do echo $f; done.for fname in a.txt b.txt c.txtyfor fname in "a.txt" "b.txt" "c.txt"arrojar resultados idénticos?for f in "${fnames[@]}"; do echo $f; done(con comillas${fnames[@]}) si losfnamesvalores pueden contener espacios en blanco. Y debe usar"$f", especialmente si está haciendo algo más sofisticado queecho(por ejemplo,catocp). (E incluso si solo lo está haciendoecho, debería usarloprintfen su lugar.)Me parece que deberías hacer ...
fuente
Como señaló el usuario 13742 en los comentarios , podemos hacer uso de matrices en
bashyksh:Y funciona así:
Sin embargo, algunos shells como
dash(/bin/shen Ubuntu) no admiten matrices. En tal caso, podríamos recurrir al uso de la estructura del documento aquí:<<fuente