No bash, eu sei que é possível escrever um for
loop no qual alguma variável de controle de loop i
itera sobre números inteiros especificados. Por exemplo, eu posso escrever um script de shell bash que imprima os números inteiros entre 1 e 10:
#!/bin/bash
for i in {1..10}
do
echo $i
done
É possível, em vez disso, iterar sobre uma variável de controle de loop que é uma string, se eu fornecer uma lista de strings? Por exemplo, suponha que eu tenha uma sequência fname
que represente um nome de arquivo. Eu quero chamar um conjunto de comandos para cada nome de arquivo. Por exemplo, talvez eu queira imprimir o conteúdo do fname
uso de um comando como este:
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
Em outras palavras, na primeira iteração, fname
deve ter o valor fname="a.txt"
, enquanto na segunda iteração, fname
deve ter o valor fname="b.txt"
, e assim por diante. Infelizmente, parece que a sintaxe acima não está correta. Eu gostaria de obter a saída:
a.txt
b.txt
c.txt
mas quando tento o código acima, obtenho esta saída:
{a.txt,
b.txt,
c.txt}
Você pode me ajudar a determinar a sintaxe correta, para que eu possa alterar iterativamente o valor / conteúdo da variável fname
? Obrigado pelo seu tempo.
fonte
{}
, você não precisa de nada para fazer um loop sobre uma lista (delimitada por espaço) #{}
e o,
s. A alternativa é remover os espaços. Então,"a.txt" "b.txt" "c.txt"
ou{"a.txt","b.txt","c.txt"}
. Mas eu prefiro{a..c}.txt
.Respostas:
A sintaxe correta é a seguinte:
fonte
fnames=( a.txt b.txt c.txt )
você pode usar a sintaxefor f in ${fnames[@]}; do echo $f; done
.for fname in a.txt b.txt c.txt
efor fname in "a.txt" "b.txt" "c.txt"
produz resultados idênticos?for f in "${fnames[@]}"; do echo $f; done
(com aspas${fnames[@]}
) se osfnames
valores puderem conter espaços em branco. E você deve usar"$f"
, especialmente se estiver fazendo algo mais sofisticado do queecho
(por exemplo,cat
oucp
). (E mesmo se você está fazendo únicaecho
, você deve usarprintf
em seu lugar.)Parece-me que você deveria fazer ...
fonte
Conforme observado por user13742 nos comentários , podemos fazer uso de matrizes em
bash
eksh
:E funciona da seguinte maneira:
No entanto, alguns shells como
dash
(/bin/sh
no Ubuntu) não suportam matrizes. Nesse caso, poderíamos recorrer ao uso da estrutura do documento aqui:<<
fonte