Iterando o array inline no zsh

2

Estou tentando descobrir como fazer um comando para vários itens. Por exemplo:

mycommmand fileA; mycommand fileB; mycommand fileC;

Eu posso fazer assim:

files=(fileA fileB fileC)
for fl in $files; mycommand $fl

Quando tento inline isso falha:

$for fl in (fileA fileB fileC); echo $fl
zsh: invalid mode specification

Isso é possível em zsh? Examinei o manual em matrizes, mas ele não mencionou como fazer isso.

    
por Bayes 12.02.2015 / 03:20

2 respostas

4
$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 de man 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 como for 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

    
por 12.02.2015 / 18:49
1

Claro que é possível. Remova os suportes:

monsterkill-ub-dt% for fl in (xfile yfile); cat ${fl}
zsh: invalid mode specification

monsterkill-ub-dt% for fl in xfile yfile; cat ${fl}  
x
y

Isso também funciona:

monsterkill-ub-dt% for fl in *; cat ${fl} 
x
y
    
por 12.02.2015 / 04:28

Tags