Eu tenho uma string de várias linhas que eu preciso iterar, mas não estou usando o bash. Conselhos

2

Estou usando o Dash porque ele é executado no meu rPi. Bash não é uma opção.

Estou reescrevendo um script Bash para trabalhar com o Dash. Eu estou esperando para torná-lo compatível com POSIX (portátil) quanto possível. O problema é que é difícil encontrar ajuda sobre como fazer loops por meio de sequências de várias linhas que não envolvem o Bash.

Meu script funciona até eu chegar a um ponto em que tenho que passar por uma lista de 100 a 1000 dispositivos, cada um em sua própria linha em um arquivo de texto. Por exemplo, o arquivo pode ser semelhante a:

foo
bar
device
blah

Estou importando as palavras usando um comando simples cat : LIST="$(cat $2)" . A partir daqui, preciso percorrer cada palavra em $LIST :

for ARRAY in ${LIST}
do
    printf "Getting VLANS for: $ARRAY"

    VLANS=$(snmpbulkwalk -v 2c -t 2 -r 3 -c "$COMMUNITY" "$ARRAY.dcs.byu.edu" XIRRUS-MIB::vlanName -Oqv)
    printf "$ARRAY,$VLANS" >> "$REPORT"
done

Quando o loop começa $ARRAY praticamente imprime tudo o que $LIST tem, efetivamente tornando-o inútil. É vital que apenas uma palavra seja armazenada em $ARRAY , pois snmpbulkwalk só pode manipular um dispositivo por vez. Ele retornará todos os dados como uma cadeia de várias linhas, no entanto, isso pode ser facilmente manipulado usando sed para substituir cada nova linha por uma vírgula.

Então, o que é um método adequado e / ou eficaz de iterar através de cada palavra em uma string? Matrizes, pelo que entendi, são inexistentes em Dash, tornando as mutações um pouco mais difícil. Eu tentei usar o guia do Ubuntu e esta referência muito útil . Enquanto estou escrevendo isso, estou começando a pensar que talvez tenha que tentar usar grep para ler linha por linha e aninhar outro para-loop, mas não tenho certeza se existe um método mais simples, "limpo". maneira.

Vocês são fantásticos! Respostas rápidas e limpas e alguns exemplos.

Então, eu criei duas versões diferentes do script, as quais funcionam perfeitamente. O primeiro foi feito como roaima delineado e também foi sugerido pela steeldriver. Eu substituí meu loop por um while que, em vez disso, leria meu arquivo linha por linha. Obrigado por isso, isso certamente ajuda a simplificar as coisas e mostra que as matrizes não eram necessárias no meu caso.

Minha segunda versão simplesmente substituiu printf "Getting VLANS for: $ARRAY" por echo "Getting VLANS for: $ARRAY" e acabei removendo-a para ver o que aconteceria. De alguma forma, isso fez toda a diferença: ARRAY não continha tudo que estava em LIST , o que permitiu que o restante do código funcionasse corretamente. Se alguém quiser esclarecer mais sobre como isso funcionou, faça-o nos comentários.

Obrigado mais uma vez pessoal! Está funcionando muito mais rápido do que antes no Bash. Mais alguns ajustes para analisar os dados de snmp é tudo o que resta!

    
por Kamikaze Rusher 23.04.2015 / 01:51

1 resposta

3

Isto é como eu iria ler uma linha de cada vez a partir de um arquivo

while IFS= read -r DEVICE
do
    ....
done < your_file
    
por 23.04.2015 / 02:07