소스 스크립트에 서브 쉘에 문제가 있습니다. 첫 번째 예는 아마도 서브 쉘이 필요하지 않을 것입니다. 그러나 우리는 "Some more action"아래에 무엇이 숨겨져 있는지 모릅니다. 가장 인기있는 대답은 숨겨진 버그로, I / O를 증가시키고, 루프 내부에서 couter를 복원하기 때문에 서브 쉘에서 작동하지 않습니다.
'\'기호를 추가하지 마십시오. bash 인터프리터에게 줄 연속에 대해 알립니다. 나는 그것이 당신이나 누구에게 도움이되기를 바랍니다. 그러나 제 생각에이 스크립트는 AWK 스크립트로 완전히 변환되어야하며 그렇지 않으면 regexp 또는 perl을 사용하여 파이썬으로 다시 작성되어야하지만, 수년에 걸친 perl 인기는 저하됩니다. 파이썬으로 더 잘하십시오.
서브 쉘이없는 수정 된 버전 :
#!/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
정말로 필요한 경우 서브 쉘이있는 버전
#!/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