Я относительно новичок в сценариях Bash и, наконец, подумал о том, что было бы хорошим введением в него. У меня есть коллекция программ сортировки, которые я пытаюсь рассчитать. Как и в большинстве тестов, хорошо получить большой размер выборки, но сложно сделать это последовательно. Я подумал, что автоматизация процесса с помощью скрипта Bash будет хорошим способом сделать это, но я не слишком много работаю с Bash.
Программы сортировки написаны на C ++ и выводят, сколько времени им понадобилось для сортировки массива из 10000 целочисленных значений, считанных из файла. Я использую несколько разных методов для сортировки массива, включая пузырьковую сортировку, быструю сортировку и параллельную (ускорение потоков) быструю сортировку. В конце их выполнения время выводится на консоль, и выполнение останавливается. Что я хотел бы сделать в скрипте Bash …
for 1 to 100:
./quicksortpar --this is the command to start the program
take time reading from output, place in collection
--when that's done
for 1 to 100 in the collection:
add each item in the collection to a running total
--when that's done
echo running total/ 100
Как мне сделать это в Bash? Является ли это возможным?
РЕДАКТИРОВАТЬ:
Вот текущий Zsh-скрипт, который я получил от Tony D:
(Обновление: случайно сработало в zsh — не работает в bash)
TOTAL=0
for ((i=1; i<=100; i++))
do
let TOTAL+=$(./quicksortpar)
done
let AVG=TOTAL/10
echo $AVG
Вы можете использовать GNU До нашей эры для арифметики с плавающей запятой в bash. Так что сделайте что-то вроде ниже
#!/bin/bash
declare -a coll
for _ in {1..100}; do
coll+=("$(./quicksortpar)")
done
sum=0
for i in ${coll[@]}; do
sum="$(echo "$sum + $i" | bc -l)"done
echo "$sum / ${#coll[@]}" | bc -l
Обратите внимание, что время может быть суммировано один раз, а не в цикле, за Предложение Джонатана Леффлера
sum=$( { printf "%d+" "${coll[@]}"; echo 0; } | bc -l)