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