назначить вывод программы ac переменной оболочки: ошибка токена

назначить вывод программы ac переменной оболочки: ошибка токена

У меня есть скрипт оболочки для запуска несколько раз программы .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

Связанный контент