將 ac 程式的輸出分配給 shell 變數:令牌錯誤

將 ac 程式的輸出分配給 shell 變數:令牌錯誤

我有一個 shell 腳本來運行多次 .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)))  

與 $((..)) 一起浮動

我不相信你可以使用$((...))符號來添加浮點數。至少當我嘗試時,它不起作用:

$ 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

相關內容