$for fl in (fileA fileB fileC); echo $fl
Aqui, (
é analisado como o início de um Glob Qualifier , como em ls *(a+2)
.
O qualificador f
representa arquivos com direitos de acesso correspondentes a especificações , por isso você obtém o erro especificação de modo inválido , porque ileA
não é um acesso válido especificação certa.
Se você tentar, por exemplo, $for fl in (anotherfileA fileB fileC); echo $fl
você recebe zsh: number expected
, porque o qualificador a
deve selecionar por tempo de acesso . E assim por diante ...
Então, como fazer isso direito? - Em zsh existem duas sintaxes possíveis para para loops: #
-
O número um é descrito na página man:
for name ... [ in word ... ] term do list done
Então, como @SadBunny já apontou, a sintaxe correta do seu exemplo é
for fl in fileA fileB fileC; echo $fl
-
O número 2 é para pessoas preguiçosas como eu (conta os toques de tecla
;)
), documentado na seção FORMAS ALTERNATIVAS PARA COMANDOS COMPLEXOS deman zshmisc
:for name (word ...) { cmd1; cmd2; }
que pode ser simplificado para apenas um comando no corpo do loop, omitindo os braquetes cacheados:
for fl (fileA fileB fileC) echo $fl
Este formulário tem duas principais vantagens da IMHO:
- mais fácil de lembrar (exatamente um par de parênteses, nenhum ou um par de chaves)
- funciona como
for fl (fileA fileB fileC) mycommand $fl
, bem comofor fl ($files) mycommand $fl
- mesma sintaxe para valores ou variáveis literais.
# Não contando a aritmética para loops no formulário for (( [expr1] ; [expr2] ; [expr3] )) do list done