ac 프로그램의 출력을 쉘 변수에 할당: 토큰 오류

ac 프로그램의 출력을 쉘 변수에 할당: 토큰 오류

3개의 입력 매개변수를 허용하는 .c 프로그램('스위치')을 여러 번 실행하는 쉘 스크립트가 있습니다. 값을 전달하는 프로그램을 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)))  

$((..))로 부동

나는 표기법을 사용하여 부동 소수점을 추가할 수 있다고 믿지 않습니다 $((...)). 적어도 시도했을 때는 작동하지 않았습니다.

$ 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

관련 정보