Kịch bản nguồn có một số vấn đề với subshell. Ví dụ đầu tiên, bạn có thể không cần subshell. Nhưng chúng tôi không biết những gì được ẩn trong "Một số hành động nữa". Câu trả lời phổ biến nhất có lỗi ẩn, nó sẽ tăng I / O và sẽ không hoạt động với subshell, vì nó khôi phục couter bên trong vòng lặp.
Không fortot thêm dấu '\', nó sẽ thông báo cho trình thông dịch bash về việc tiếp tục dòng. Tôi hy vọng nó sẽ giúp bạn hoặc bất cứ ai. Nhưng theo tôi, tập lệnh này nên được chuyển đổi hoàn toàn thành tập lệnh AWK, hoặc nếu không thì viết lại thành python bằng cách sử dụng regrec, hoặc perl, nhưng mức độ phổ biến của perl trong nhiều năm bị suy giảm. Tốt hơn làm điều đó với python.
Phiên bản sửa lỗi không có 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
Phiên bản có subshell nếu thực sự cần thiết
#!/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