للحلقة في البرنامج النصي shell - أضف كسر في ملف CSV
-
05-07-2019 - |
سؤال
أحاول استخدام أ for
حلقة في نص قذيفة.
أقوم بتنفيذ أمر من ملف نصي. أرغب في تنفيذ كل أمر 10 مرات وإدراج بعض الإحصائيات في ملف CSV. بعد الانتهاء من هذا الأمر ، أريد أن أبدأ التالي ولكن وضعت كسرًا في ملف CSV بعد الأمر الأول الذي تم 10 مرات.
هو الصحيح التالي:
#Function processLine
processLine(){
line="$@"
for i in 1 2 3 4 5 6 7 8 9 10
do
START=$(date +%s.%N)
echo "$line"
eval $line > /dev/null 2>&1
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$line, $START, $END, $DIFF" >> file.csv 2>&1
echo "It took $DIFF seconds"
echo $line
done
}
شكرا جميع على أي مساعدة
تحديث
إنها تقوم بالحلقة بشكل صحيح ، لكن لا يمكنني الحصول عليها لإضافة استراحة سطر بعد تنفيذ كل أمر 10 مرات.
المحلول
processLine()
{
line="$@"
echo $line >> test_file
for ((i = 1; i <= 10 ; i++))
do
# do not move to the next line
echo -n "$i," >> test_file
done
# move to the next line: add the break
echo >> test_file
}
echo -n > test_file
processLine 'ls'
processLine 'find . -name "*"'
نصائح أخرى
ماذا عن مجرد إضافة خط "echo >> file.csv
" بعد، بعدما done
؟ أو هل تريد فقط خط فارغ بين كل كتلة من 10؟ ثم يمكنك القيام بما يلي:
FIRST=1
processline()
{
if (( FIRST )) then
FIRST = 0
else
echo >> file.csv
fi
...rest of code...
}
وإلا فقد ترغب في تقديم مثال على الإخراج المطلوب والإخراج الذي تحصل عليه الآن.
يبدو معقول. هل تفعل ما تريده؟
يمكنك تبسيط بعض الأشياء ، على سبيل المثال
DIFF=$(echo "$END - $START" | bc)
يمكن أن يكون عادلًا
DIFF=$((END - START))
إذا كانت النهاية والبدء في أعداد صحيحة ، وليس هناك حاجة لوضع الأشياء في المتغيرات إذا كنت ستستخدمها مرة واحدة فقط.
إذا كان ليس فعل ما تريد ، قم بتحرير السؤال لوصف المشكلة (ما تراه يفعله وما تفضل القيام به).