For loop é executado duas vezes,

0

Portanto, sou relativamente novo no bash scripting, mas quero um trabalho bash que:

Crie um carimbo de data e hora pós-datado. (como um var ou para um arquivo)

Ler linhas de um arquivo chamado feeds.txt.

Separe a string numérica da string inteira em duas variáveis $ feedNum e $ wholeString.

Em seguida, execute um comando cat para criar ou anexar um novo arquivo chamado $ wholeString anexando o conteúdo de timestamp.txt a esse arquivo.

Por fim, execute um comando wget para inserir $ feedNum na cadeia url e envie a resposta do wget para o arquivo $ wholeString criado anteriormente.

Aqui está o que eu tenho.

feeds.txt parece (eventualmente será mais longo):

8147_feed_name.xml
19176_nextfeed_name.xml

E o roteiro que eu montei parece com isso.

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
for feedNum in 'cat feeds.txt |cut -d _ -f 1';do
   for  wholeString in 'cat feeds.txt'; do
    cat /home/scripts/timestamp.txt >>/home/scripts/tmp/$wholeString ;
    wget https\://some.url.com/reports/uptimes/${feedNum}.xml?\&api_key=KEYKEYKEYKEY\&location=all\&start_date=recent_hour -O ->>/home/scripts/tmp/$wholeString;
done
done

O meu problema é que ele é executado 4 vezes e, portanto, se eu eliminar o cat e o wget e substituí-los por um eco simples, como este,

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
for feedNum in 'cat feeds.txt |cut -d _ -f 1';do
   for  wholeString in 'cat feeds.txt'; do
    echo $feedNum $wholeString
done
done

Eu recebo uma saída como essa, em que as linhas superior e inferior estão corretas. Os dois do meio são um mix-mash.

8147 8147_feed_name.xml
8147 19176_nextfeed_name.xml
19176 8147_feed_name.xml
19176 19176_nextfeed_name.xml

Eu entendo por que está fazendo isso, mas não como corrigi-lo.

    
por Jon D 12.05.2016 / 19:00

2 respostas

1

Isso deve fazer o truque para dividir a string (embora, como sempre, desconfie de espaços em seus nomes de arquivos):

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
while IFS=_ read feedNum xmlFile; do
  echo "$feedNum $xmlFile"
done < feeds.txt

Deve ser trivial montar sua chamada wget daqui.

    
por 12.05.2016 / 19:37
0

OP Aqui, como um nome de usuário diferente. Acabei usando o primeiro código que você postou no DopeGhoti. Com alguma ligeira modificação. Obrigado por me mostrar como pegar uma linha e, em seguida, executar a partir dela, em vez de tentar reler o arquivo de origem e puxar para cada um.

 #Create Timestamp
    date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/sitename/timestamp.txt

    #Loop Logic
    while read line; do
       feedNum="$(echo "$line" | cut -d_ -f1)"
       wholeString="$(echo "$line")"
       cat /home/scripts/sitename/timestamp.txt >>/home/scripts/sitename/$wholeString
       wget https\://my.sitename.com/reports/uptimes/${feedNum}.xml?\&api_key=KEY\&location=all\&start_date=recent_hour -O ->>/home/scripts/sitename/$wholeS$
    done < feeds.txt

O que resultou na saída correta para todos os 18 feeds que tivemos.

Obrigado!

    
por 12.05.2016 / 21:13

Tags