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.
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.
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.
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).
#!/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.
Tags shell shell-script arithmetic