Bash itera uma lista de strings

6

Eu tenho este script bash:

for opt in string1 string2 string3 ... string99
do somestuff

Funciona, mas eu gostaria de substituir a listagem explícita das minhas strings por um arquivo que realmente contenha todas as strings; algo assim:

strings=loadFromFile
for opt in $strings
do somestuff

Como devo fazer isso?

    
por michelemarcon 19.09.2012 / 15:13

5 respostas

10

while read VAR é provavelmente o melhor aqui, pois lida com entradas por linha. Você pode redirecioná-lo de um arquivo, por exemplo:

while IFS= read -r THELINE; do
  echo "..$THELINE"
done </path/to/file

Isso dará a você cada linha precedida de ".."

Para o seu caso de exemplo:

while IFS= read -r opt; do
  #somestuff $opt
done </path/to/file

Veja Por que 'enquanto o IFS = read' é usado com tanta freqüência, em vez de 'IFS =; enquanto lê ... '? para explicações.

    
por 19.09.2012 / 15:37
7
while IFS= read -r opt
do 
    some_stuff
done < file_with_string

Veja Por que 'enquanto o IFS = read' é usado com tanta freqüência, em vez de 'IFS =; enquanto lê ... '? para explicações.

    
por 19.09.2012 / 15:38
4

O while IFS= read -r line; do ...; done < aFile é a melhor resposta

Se suas strings não contiverem espaços em branco ou \[*? , você poderá fazer

for word in $(< aFile); do something; done

$(< file) é um recurso bash que lê o arquivo (como cat , exceto sem precisar gerar um novo processo).

    
por 19.09.2012 / 17:53
2

Por que você não usa o readarray builtin (requer bash >= 4.0 )?

readarray < FileNameFromWhereToLoad    # push every line of 
                                       # 'FileNameFromWhereToLoad' onto 
                                       # $MAPFILE by default

for i in $MAPFILE ; do
    echo $i
done
    
por 19.09.2012 / 15:38
1

Meu conselho:

cat INPUTFILE| {
  declare -a LINES
  mapfile -t LINES
  for line in "${LINES[@]}"
  do
    somestuff
  done
}
    
por 19.09.2012 / 15:25