O script de origem tem algum problema com o subshell. Primeiro exemplo, você provavelmente não precisa do subshell. Mas não sabemos o que está oculto em "Um pouco mais de ação". A resposta mais popular tem bug oculto, que aumentará a E / S e não funcionará com subshell, porque restaura o loop interno do couter.
Não adicione o sinal '\', ele informará o intérprete do bash sobre a continuação da linha. Espero que ajude você ou qualquer um. Mas, na minha opinião, esse script deve ser totalmente convertido em script AWK, ou reescrito em python usando regexp ou perl, mas a popularidade do perl ao longo dos anos é degradada. Melhor fazê-lo com python.
Versão corrigida sem subcamada:
#!/bin/bash
WFY_PATH=/var/log/nginx
WFY_FILE=error.log
COUNTER=0
grep 'GET /log_' $WFY_PATH/$WFY_FILE | grep 'upstream timed out' |\
awk -F ', ' '{print $2,$4,$0}' |\
awk '{print "http://example.com"$5"&ip="$2"&date="$7"&time="$8"&end=1"}' |\
awk -F '&end=1' '{print $1"&end=1"}' |\
#( #unneeded bracket
while read WFY_URL
do
echo $WFY_URL #Some more action
COUNTER=$((COUNTER+1))
done
# ) unneeded bracket
echo $COUNTER # output = 0
Versão com subshell se for realmente necessário
#!/bin/bash
TEMPFILE=/tmp/$$.tmp #I've got it from the most popular answer
WFY_PATH=/var/log/nginx
WFY_FILE=error.log
COUNTER=0
grep 'GET /log_' $WFY_PATH/$WFY_FILE | grep 'upstream timed out' |\
awk -F ', ' '{print $2,$4,$0}' |\
awk '{print "http://example.com"$5"&ip="$2"&date="$7"&time="$8"&end=1"}' |\
awk -F '&end=1' '{print $1"&end=1"}' |\
(
while read WFY_URL
do
echo $WFY_URL #Some more action
COUNTER=$((COUNTER+1))
done
echo $COUNTER > $TEMPFILE #store counter only once, do it after loop, you will save I/O
)
COUNTER=$(cat $TEMPFILE) #restore counter
unlink $TEMPFILE
echo $COUNTER # output = 0