Решение здесь состоит в том, чтобы использовать встроенные команды в оболочке, так как тогда не будет выполняться несколько fork/exec на строку, что относительно очень дорого.
Я бы сделал так:
#! /bin/bash
echo -n "Enter the logfilename : "
read logfilename
echo "Entered name : $logfilename"
echo "outside the while loop"
let success=0
let failure=0
let total=0
failedtests=()
while read line; do
case "$line" in
*Begin\ of\ *) echo $line
failedtests+=( ${line/Begin of /} )
;;
*PASSED*) ((success++));;
*FAILED*) ((failure++));;
*End\ of\ *) ((total++));;
esac
done < "$logfilename"
echo "Total testcases : $total"
echo "Total testcase with Success : $success"
echo "Total testcase with Failure : $failure"
echo "Failed tests:" ${failedtests[@]}
Вы можете использовать case
для сопоставления шаблонов глобусов. Согласно вашему примеру данных (, у которых есть «Пройдено», а не «ПРОШЛО», для которых вы выполняете поиск ), начальный *
каждого шаблона может быть опущен, однако с ним он точно соответствует использованию grep.
Я также покончил с переменной DONE
, так как вы бесполезно перебираете в цикле последнюю пустую строку (, полученную в результате конца -файла -).
РЕДАКТИРОВАТЬ :Добавлен сбор и отображение неудачных тестов. Они собраны в массиве bash failedtests
. ${line/Begin of /}
приводит к содержимому line
с удаленной строкой.Наконец, полное содержимое массива отображается с помощью ${failedtests[@]}
.