Existe uma maneira de especificar um determinado intervalo de números usando array em um script? [fechadas]

1

Estou tentando adicionar os 20 primeiros números gerados aleatoriamente com um array no meu script. Isso é possível?

Eu usei meu script anterior para gerar 100 números e esperava poder usá-lo também nesse cenário. Agora eu preciso adicionar o primeiro 20 usando matriz. Eu poderia incorporar uma função no meu script para resolver isso?

Script principal

MAXCOUNT=100
count=1

while [ "$count" -le $MAXCOUNT ]; do
number[$count]=$RANDOM
let "count += 1"
done

echo "${number[@]}
    
por DSH72 02.12.2015 / 18:23

2 respostas

3

Acho que você está perguntando como obter os primeiros N elementos de um array bash. Em caso afirmativo, isso deve funcionar:

$ array=( $(seq 1 30 ) )
$ echo ${array[@]}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
$ echo ${array[@]:0:20}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

O formato geral é ${array[@]:START:LENGTH} . Isso retornará o COMPRIMENTO dos próximos elementos do array a partir do START.

Então, para adicionar os 20 primeiros, você poderia fazer (note que estou começando em 0, não em 1, pois os arrays começam em 0. Sugiro que você corrija seu script e defina count=0 no início, em vez de count=1 ; se você não quiser, altere o 0 abaixo para um 1 ):

for i in ${number[@]:0:20}; do
    sum=$((sum + i))
done
echo $sum

Como alternativa, você pode apenas iterar os primeiros 20 elementos da matriz:

for((i=0;i<20;i++))
do
    sum=$(( sum + number[$i] ))
done
echo "$sum"

Ambos os métodos pressupõem que você esteja adicionando inteiros. Bash não lida com números de ponto flutuante, então eles vão quebrar se você tentar adicionar frações. Se isso é um problema, use o truque inteligente do @hemayl ou qualquer outro programa que possa fazer matemática. Por exemplo:

echo "${number[@]:0:20}" | perl -lane '$k+=$_ for @F; print $k'
    
por terdon 02.12.2015 / 18:36
2

Para adicionar os primeiros 20 números da matriz number :

echo "${number[@]:0:20}" | tr ' ' '+' | bc

Ou

tr ' ' '+' <<<"${number[@]:0:20}" | bc
  • "${number[@]:1:20}" obtém os primeiros 20 elementos da matriz

  • tr ' ' '+' converte todos os espaços em + , para que possamos usá-lo como entrada para bc para concluir a adição

por heemayl 02.12.2015 / 18:50