Kaynak komut dosyasının alt kabukla ilgili bazı sorunları var. İlk örnek, muhtemelen alt kabuğa ihtiyacınız yoktur. Ama "Biraz daha eylem" altında neyin saklı olduğunu bilmiyoruz. En popüler yanıt, I / O'yu artıracak ve alt kabukla çalışmayacak, çünkü döngü içindeki kodlayıcıyı geri yüklediği için gizli hata içeriyor.
'\' İşaretini eklemeyi unutmayın, bu satırın devamı hakkında bash yorumlayıcısını bilgilendirecektir. Umarım size veya herhangi birine yardımcı olur. Ama bana göre bu komut dosyası tamamen AWK betiğine dönüştürülmeli veya regexp veya perl kullanılarak python'a yeniden yazılmalıdır, ancak perl popülaritesi yıllar içinde azalmıştır. Python ile yapsan iyi olur.
Alt kabuksuz Düzeltilmiş Sürüm:
#!/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
Gerçekten gerekliyse alt kabuklu versiyon
#!/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