Le script source a un problème avec le sous-shell. Premier exemple, vous n'avez probablement pas besoin de sous-shell. Mais nous ne savons pas ce qui est caché sous "Encore plus d'action". La réponse la plus populaire a un bogue caché, qui augmentera les E / S, et ne fonctionnera pas avec le sous-shell, car il restaure le routeur à l'intérieur de la boucle.
N'ajoutez pas le signe '\', cela informera l'interpréteur bash de la continuation de la ligne. J'espère que cela vous aidera, vous ou n'importe qui. Mais à mon avis, ce script devrait être entièrement converti en script AWK, ou bien réécrit en python à l'aide de regexp ou de perl, mais la popularité de perl au fil des ans est dégradée. Mieux vaut le faire avec python.
Version corrigée sans sous-shell:
#!/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
Version avec sous-shell si c'est vraiment nécessaire
#!/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