foreach percorrer condições correspondentes armazenadas em uma variável

0

Estou usando o foreach para recuperar nomes de subpastas que correspondam a_condição *, seguindo as instruções:

foreach i (a_condition*)
    echo $i
end

imprimirá a_condition1 a_condition2 ...

Mas quando eu tento não codificar a_conditon * como:

set condition = a_condition*
foreach i ($condition)
   echo $i
end

Ele só imprimirá o primeiro valor, por que isso está acontecendo?

    
por cdnszip 19.09.2016 / 09:31

1 resposta

1

Em todas as implementações / versões de csh que conheço:

set condition = a_condition*

é o mesmo que:

set condition = (a_condition*)

Isso cria um array contendo todos os nomes de arquivos resultantes da expansão do a_condition* glob. Eu verifiquei com a implementação original de 1979 csh no 2BSD em um emulador PDP11, e foi o mesmo lá.

O comportamento que você descreve parece que a linha foi interpretada como

set condition = a_condition1 a_condition2 a_condition3...

Ou seja, definindo condition como uma variável com valor a_condition1 e uma variável chamada a_condition2 , então uma chamada a_condition3 ... Não conheço nenhuma implementação csh que se comporta desse modo e eu acharia improvável que tal implementação existisse, dado que a implementação original não funcionou, mas no caso, você pode tentar:

set condition = (a_condition*)

para ver se isso faz diferença. Isso também seria mais auto-descritivo.

Em qualquer caso, se você quiser que o glob seja expandido no momento da atribuição e o loop faça um loop pelos elementos, a sintaxe deve ser:

set condition = (a_condition*)
foreach i ($condition:q)
  echo $i:q
end

E se você quiser que condition contenha a a_condition* string , e que a string seja expandida como uma glob no momento do loop, isso seria:

set condition = 'a_condition*'
foreach i ($condition)
  echo $i:q
end
    
por 19.09.2016 / 22:23