Os dois estilos de loops diferem no que eles podem expressar?

1

Existem dois estilos de sintaxe for-loop:

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

for name [ [in [words ...] ] ; ] do commands; done

De relance, os tipos de loop que dois podem expressar parecem não estar relacionados entre si. o primeiro pode expressar o loop com base em expressões aritméticas, enquanto o segundo pode expressar o loop com base na enumeração de membros em um conjunto words .

Essencialmente, eles realmente diferem em que tipos de looping eles podem expressar, ou são equivalentes entre si? Se o primeiro, quando usar qual?

    
por Tim 24.04.2016 / 18:03

3 respostas

4

A segunda forma é sempre finita, a primeira pode trivialmente ser feita em um loop infinito:

for ((;;)); do echo $SHELL; done
    
por 24.04.2016 / 18:08
2

O primeiro

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

é discutivelmente mais geral que o segundo

for name [ [in [words ...] ] ; ] do commands; done

porque

  • as variáveis usadas nas expressões podem ser usadas como índices de matriz (e obter a seleção de uma lista de palavras usadas no segundo),
  • mas o segundo formulário usa uma lista imutável de palavras para percorrer (mas o primeiro formulário usa uma expressão para finalizar o loop, o que significa que a terminação de loop não é predeterminada na mesma extensão ).
por 24.04.2016 / 18:18
2

Isto:

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

Faz um loop sobre inteiros, pois é forçado a fazê-lo pelo fato de que dentro da parte (( )) each (dividida por ; ) é uma "expressão aritmética".

É semelhante a um c para loop, tem início, fim e "ação de etapa" definidos em uma linha, é mais compacto.

O segundo funciona na lista de palavras, que podem ser números, strings ou matrizes:

for a in 1 2 3 4 5; do echo "$a"; done
for a in one two three four five; do echo "$a"; done
for a in "${one[@]}" ; do echo "$a"; done

Uma ressalva disso é que a lista de palavras está sujeita à divisão de shell, o que não é um problema na primeira construção.

    
por 25.04.2016 / 00:19

Tags