実行ファイルの出力を取得し、いくつかの計算を実行するシェルスクリプトを作成します。

実行ファイルの出力を取得し、いくつかの計算を実行するシェルスクリプトを作成します。

私はシェルスクリプトに慣れていません。次の擬似コード用のシェルスクリプトを作成したいと思います。

min=some garbage value
for(i=1 to N){  // N and n will be taken as input for the shell script. 
   for(j=1 to n){
       val= './a.out' // call the executable a.out and take the output in val
       if(val<min)    // a.out is a random number generator script
           min=val; 
   }
   arr[k++]=min;
}
// Then I want to calculate the sum of the elements of the array 'arr'.

シェルスクリプトでこれを行うにはどうすればよいですか? a.outまあ、出力として数値文字列が生成されます。この文字列を変数に変換する必要がありますval。どうすればいいですか?たとえば、出力はa.out生成されますが浮動小数点ではない文字配列です。シェルスクリプトを使用して浮動小数点に変換したいのですが、実行可能ファイルのCコードを変更するアクセス権はありません。12.3412.34a.out

#!/bin/bash
# set min to some garbage value
min=1
N=$1
n=$2
for (( i=1; i<=$N; i++ )); do
   for (( j=1; j<=$n; j++ )); do
       val=$(/path/to/a.out)
       val2=`echo $val | bc`    // is this the correct syntax?
       if (( $val2 < $min )); then
           min=$val2; 
       fi   
   done
   arr=("${arr[@]}" "$min")
done

# Then I want to calculate the sum of the elements of the array 'arr'.
sum=0
for (( l=0; l<${#arr[@]}; l++ )); do
  sum=$( expr $sum + ${arr[$l]} )
done

echo "Sum of \$arr = ${sum}"

上記のコードは私には機能しません。

答え1

Val=$(./a.out)
Val=`a.out`

どちらも実行され、a.out出力をVal

bash または互換性のあるシェルを想定します。

答え2

以下は、コードをbashまたはkshで使用する必要があるスクリプトに変換するスクリプトです。

#!/bin/bash

# set min to some garbage value
min=1

N=$1
n=$2

for (( i=1; i<=$N; i++ )); do
   for (( j=1; j<=$n; j++ )); do
       val=$(/path/to/a.out)
       if (( $val < $min )); then
           min=$val; 
       fi   
   done
   arr=("${arr[@]}" "$min")
done

# Then I want to calculate the sum of the elements of the array 'arr'.
sum=0
for (( l=0; l<${#arr[@]}; l++ )); do
  sum=$( expr $sum + ${arr[$l]} )
done

echo "Sum of \$arr = ${sum}"

今これはコードの実際の翻訳です。 $ valの代わりに$ minを配列にプッシュするので、$ arr配列に値を割り当てる方法を変更できます。 $val が $min より小さい場合、運ばれる $min の値が変更されます。 $val値に進みます(後続のループ反復で、より低い$val値が見つかるまで)。

答え3

#!/bin/bash
# define as first and second parameter for script:
N=$1
n=$2
# declare as array:
declare -A arr 
k=0
min=7 # some garbage value

# for-loop with variable: Use 'seq'
for i in $(seq 1 $N)
# do...done - not curly braces:
do  
   for j in $(seq 1 $n)
   do 
     # already explained
     val=$(./a.out)
     # arithmetic evaluation in double parens:
     if (( val < min ))
     then
       min=$val
     fi
   done
   arr[$k]=$min
   k=$((k+1))
done 
array=${arr[*]}
addition=${array// /+}
echo $((addition))

コメントに役立つヒントをいただいたGillesに感謝します。

関連情報