for: for NAME [in WORDS ... ] ; do COMMANDS; done
# the syntax
Execute commands for each member in a list.
# the member list refers to the [in WORDS ... ] part.
# you see them in brackets because they are optional.
The 'for' loop executes a sequence of commands for each member in a list of items
# the 'sequence of commands' refers to the COMMANDS part in the syntax.
If 'in WORDS ...;' is not present, then 'in "$@"' is assumed.
# if the optional [in WORDS ... ] isn't there, it will loop over each
# positional parameter.
For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
Exit Status:
Returns the status of the last command executed.
O brace expansion
no seu exemplo não é a sintaxe por si, mas fornece o [in WORDS ... ]
de sua sintaxe adequada. você pode usar qualquer coisa que resulte na saída de palavras para que a sintaxe esteja correta, mas, dependendo do que você fizer, pode ter resultados inesperados. Como tentar ler linhas de um arquivo de texto ou lidar com números grandes por meio da expansão de chaves.
bash -c 'for x in {1..1000000000000}; do :; done'
bash: xmalloc: stringvec.c:40: cannot allocate 2909519884 bytes (94208 bytes allocated)
Como todas as 1000000000000
WORDS precisam ser expandidas antes da execução do loop for, se você não tiver o RAM para ele, o bash irá cometer erros.
Há também o estilo c para loops que possuem a sintaxe de for (( exp1; exp2; exp3 )); do COMMANDS; done
, que help for
também mostra.
Se você estiver interessado em aprender a escrever no bash, eu recomendaria a leitura: link