Escrevendo um script de shell para obter a saída de um executável e executar alguns cálculos

1

Não estou muito familiarizado com o shell script. Eu quero escrever um script de shell para o seguinte pseudo-código:

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'.

Como fazer isso por um script de shell? a.out é tal que irá produzir uma cadeia de dígitos como saída. Eu tenho que converter essa string na variável val . Como fazer isso? Por exemplo, a.out está produzindo 12.34 como saída, mas 12.34 é uma matriz de caracteres e não uma flutuação. Eu quero converter isso para flutuar através do shell script e eu não tenho permissão para alterar o código C para o qual a.out é o executável.

#!/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}"

O código acima não está funcionando para mim.

    
por RIchard Williams 07.11.2011 / 04:29

3 respostas

4

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

Ambos executarão a.out e armazenarão a saída em Val .

Assumindo o shell bash ou compatível.

    
por 07.11.2011 / 04:37
3

Este é o seu código traduzido para um script que deve funcionar com o bash, ou 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}"

Agora, esta é uma tradução real do seu código. Você pode querer mudar como você está atribuindo valores para o array $ arr, já que você está empurrando $ min para o array, e não $ val, e se $ val é menor que $ min, então você está alterando o valor de $ min transportando para o valor de $ val (até que um valor menor de $ val seja encontrado em uma iteração subsequente do loop).

    
por 07.11.2011 / 06:31
0
#!/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))

Obrigado a Gilles pela dica útil no comentário.

    
por 07.11.2011 / 06:26