Como faço para repetir a saída do shuf?

5

Se eu fizer gshuf -e $(seq 1 10) no bash, ele imprimirá os números de 1 a 10 em ordem aleatória.

Mas se eu fizer isso:

a=$(shuf -e $(seq 1 10))
for i in "${a[@]}"
do
    echo $i
    echo "next"
done

Imprime todos os dez números seguidos de "próximo".

Como faço um loop pela saída de shuf (ou gshuf in os x)? A variável, a , parece ser uma string, então eu poderia dividi-la. Mas isso parece meio desleixado. Como obtenho o shuf para gerar uma matriz?

    
por bernie2436 09.03.2015 / 14:41

5 respostas

9

Você está usando uma atribuição escalar. Use uma matriz

a=( $(shuf -e $(seq 1 10)) )
for i in "${a[@]}"
do
    echo $i
    echo "next"
done

ou deixe o shell dividir o escalar

a=$(shuf -e $(seq 1 10))
for i in ${a}
do
    echo $i
    echo "next"
done
    
por 09.03.2015 / 14:48
8

você não precisa armazenar a saída em uma variável:

seq 10 | shuf | while read i; do echo $i; done

Isso executa o loop while em um subshell, portanto, a variável i não pode persistir no shell atual. Você pode shopt -s lastpipe para compensar isso, ou evitar totalmente a tubulação

while read i; do echo $i; done < <( shuf -e $(seq 10) )
    
por 09.03.2015 / 15:02
2

Se você quiser processar $a como uma matriz, será necessário inicializá-lo como uma matriz:

a=( $(shuf -e $(seq 1 10)) )

Então o seu loop produz a saída esperada.

    
por 09.03.2015 / 14:45
2

Basta repetir a saída de shuf , você não precisa de variável aqui:

for i in $(shuf -e {1..10}); do
  echo "$i"
  echo "next"
done
    
por 09.03.2015 / 14:47
1

um one-liner ...

shuf -e {1..10} | xargs -I%    echo % next
    
por 09.03.2015 / 15:53