En bash, sé que es posible escribir un for
bucle en el que alguna variable de control de bucle i
itera 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 fname
que 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 fname
uso 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, fname
debe tener el valor fname="a.txt"
, mientras que en la segunda iteración, fname
debe 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}.txt
lugar.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.txt
yfor fname in "a.txt" "b.txt" "c.txt"
arrojar resultados idénticos?for f in "${fnames[@]}"; do echo $f; done
(con comillas${fnames[@]}
) si losfnames
valores pueden contener espacios en blanco. Y debe usar"$f"
, especialmente si está haciendo algo más sofisticado queecho
(por ejemplo,cat
ocp
). (E incluso si solo lo está haciendoecho
, debería usarloprintf
en su lugar.)Me parece que deberías hacer ...
fuente
Como señaló el usuario 13742 en los comentarios , podemos hacer uso de matrices en
bash
yksh
:Y funciona así:
Sin embargo, algunos shells como
dash
(/bin/sh
en Ubuntu) no admiten matrices. En tal caso, podríamos recurrir al uso de la estructura del documento aquí:<<
fuente