Lo script di origine ha qualche problema con subshell. Primo esempio, probabilmente non hai bisogno di subshell. Ma non sappiamo cosa sia nascosto sotto "Qualche altra azione". La risposta più popolare ha un bug nascosto, che aumenterà l'I / O e non funzionerà con la subshell, perché ripristina il ciclo interno.
Non aggiungere alcun segno "\", informerà l'interprete bash sulla continuazione della linea. Spero che possa aiutare te o qualcuno. Ma secondo me questo script dovrebbe essere completamente convertito in script AWK, oppure riscritto in python usando regexp o perl, ma la popolarità del perl negli anni è degradata. Meglio farlo con Python.
Versione corretta senza subshell:
#!/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
Versione con subshell se è veramente necessaria
#!/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