У меня есть скрипт оболочки для запуска несколько раз программы .c ('switch'), которая допускает 3 входных параметра. Я хочу запустить программу 4 раза, передавая значения {4,16,32,64}
, и для параметров
{0.1,0.2,.3,.4,.5,.55,.575,.6,.625,.65,.7,.75,.8,.9}
, строя таблицу среднего и доверительного интервала. Скрипт следующий
#!/bin/bash
if [ -e salida.txt ]; then
# echo "File exists"
rm salida.txt
fi
touch salida.txt
touch sal1.txt
touch sal2.txt
touch sal3.txt
touch sal4.txt
touch salida.txt
num=1000000
stud=3.182
for j in {0.1,0.2,.3,.4,.5,.55,.575,.6,.625,.65,.7,.75,.8,.9}
do
rm sal1.txt sal2.txt sal3.txt sal4.txt
for i in {4,16,32,64}
do
margen=0
sum=0
avg=0
for k in {1..4}
do
a$k=$((`./switch -N$i -r$j -n$num`))
sum=$((sum + a$k))
done
avg=$((sum/4))
dvt=0
for k in {1..4}
do
dvt=$((dvt + (a$k - $avg)*(a$k - $avg)))
done
dvt=$((dvt /3))
dvt=$((echo `sqrt($dvt) | bc -l`))
margen=$((dvt*$stud/2))
echo $avg $margen >> sal$i.txt
done
join sal1.txt sal2.txt sal3.txt sal4.txt >> salida.txt
done
Тем не менее, выдает мне ошибку в строке 27.
a$k=$((`./switch -N$i -r$j -n$num`))
и линии
dvt=$((echo `sqrt($dvt) | bc -l`))
margen=$((dvt*$stud/2))
Что я делаю не так?
решение1
Первые две строки, которые вы определили, используют для выполнения команды и захвата ее вывода. Это должно быть . Ваше использование для оценки математического выражения верно.$((command))
$(command)
$((expression))
Кроме того, строка квадратного корня должна быть
dvt=$(echo "sqrt($dvt)" | bc -l)
скорее, чем
dvt=$((echo `sqrt($dvt) | bc -l`))
или даже
dvt=$(echo `sqrt($dvt) | bc -l`)
Проблема с margen=
командой может заключаться в том, что вы передаете ей число с плавающей точкой в качестве одного из членов выражения.
решение2
Я бы перестроил настройку a$k
в ассоциативный массив следующим образом:
declare -a a
for k in {1..4}
do
a[$k]=$((`./switch -N$i -r$j -n$num`))
sum=$((sum + a[$k]))
done
Это позволит сделать массив a
доступным после его заполнения значениями из for
цикла выше для других циклов, расположенных ниже в вашем коде.
Эту линию ниже в последней for
петле также необходимо скорректировать следующим образом:
dvt=$((dvt + (a[$k] - $avg)*(a[$k] - $avg)))
Плавает с $((..))
Я не верю, что можно добавлять float, используя $((...))
нотацию. По крайней мере, когда я пробовал, это не сработало:
$ echo $((0.10 + .20))
bash: 0.10 + .20: syntax error: invalid arithmetic operator (error token is ".10 + .20")
Для выполнения этих операций с плавающей точкой в качестве токенов вам понадобится bc
или калькулятор, который может это делать.
$ echo "0.10 + .20" | bc
.30