للحلقة في البرنامج النصي shell - أضف كسر في ملف CSV

StackOverflow https://stackoverflow.com/questions/621915

  •  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))

إذا كانت النهاية والبدء في أعداد صحيحة ، وليس هناك حاجة لوضع الأشياء في المتغيرات إذا كنت ستستخدمها مرة واحدة فقط.

إذا كان ليس فعل ما تريد ، قم بتحرير السؤال لوصف المشكلة (ما تراه يفعله وما تفضل القيام به).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top