উত্স স্ক্রিপ্টটিতে সাব-শেল নিয়ে কিছু সমস্যা আছে। প্রথম উদাহরণ, আপনার সম্ভবত সাবশেলের দরকার নেই। তবে আমরা জানি না "আরও কিছু পদক্ষেপ" এর আড়ালে কী লুকানো আছে। সর্বাধিক জনপ্রিয় উত্তরের মধ্যে লুক্কায়িত বাগ রয়েছে যা আই / ও বাড়িয়ে তুলবে এবং সাবশেলের সাথে কাজ করবে না, কারণ এটি লুপের অভ্যন্তরে পুনরুদ্ধার করে।
'Sign' চিহ্নটি ফোরোটোট করবেন না, এটি লাইনের ধারাবাহিকতা সম্পর্কে ব্যাশ ইন্টারপ্রেটারকে অবহিত করবে। আমি আশা করি এটি আপনাকে বা যে কাউকে সহায়তা করবে। তবে আমার মতে এই স্ক্রিপ্টটি পুরোপুরি এডাব্লুকে স্ক্রিপ্টে রূপান্তর করা উচিত, না হলে রিজেক্স, বা পার্ল ব্যবহার করে পাইথনে আবার লেখা উচিত, তবে বছরের পর বছর ধরে পার্লের জনপ্রিয়তা হ্রাস পায়। অজগর দিয়ে করাই ভাল।
সাবস্কেল ছাড়াই সংশোধিত সংস্করণ:
#!/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