Como eu uso uma variável de ambiente temporária em um bash para loop?

1

Eu quero executar YII_ENV=prod yii kw/test dez vezes. Eu tentei

$ YII_ENV=prod for x in 1..10 do; yii kw/test done;
-bash: for: command not found
1304682651

(Parecia funcionar uma vez.) Eu também tentei

$ for x in {1..10} do; YII_ENV=prod yii kw/test done;
-bash: syntax error near unexpected token 'YII_ENV=prod'

GNU bash, versão 4.3.39 (2) -release (i686-pc-cygwin)

    
por Chloe 27.02.2016 / 20:50

2 respostas

3

Primeiro corrija a sintaxe do seu comando, coloque os ponto e vírgula corretamente. Em vez de:

for x in 1..10 do; yii kw/test done;

Use (adicionando uma expansão de contraventamento correto também):

for x in {1..10}; do yii kw/test; done

Em seguida, adicione a variável:

for x in {1..10}; do YII_ENV=prod yii kw/test; done
    
por 27.02.2016 / 21:06
5

A sintaxe VARIABLE=VALUE COMMAND para definir uma variável de ambiente para a duração de um comando só funciona quando o comando é um comando simples (mais precisamente, um comando externo ou um interno que age como um - veja Quando posso usar um IFS temporário para divisão de campo? / a> para mais detalhes). Você não pode usá-lo com um comando complexo, como um loop for.

Sua primeira tentativa falhou porque for não foi a primeira palavra de um comando, então não foi analisado como uma palavra-chave, então o bash procurou por um comando chamado for ao invés de analisar um loop for. Sua segunda tentativa falhou devido a um erro de sintaxe simples no loop: você precisa de um ponto-e-vírgula ou quebra de linha antes de do , novamente porque senão do não é reconhecido como uma palavra-chave. Da mesma forma, você também precisa de um ponto-e-vírgula antes de done .

for x in {1..10}; do YII_ENV=prod yii kw/test; done

Para definir uma variável para a duração do loop, se você não se preocupa em sobrescrever um valor anterior, apenas configure a variável e desmarque-a depois.

export YII_ENV=prod
for x in {1..10}; do yii kw/test; done
unset YII_ENV

Como alternativa, execute o loop em um subshell. Esta é uma opção somente se o loop não deve modificar o ambiente do shell.

(
  export YII_ENV=prod
  for x in {1..10}; do yii kw/test; done
)

Como alternativa, execute o loop em uma função e torne a variável local para a função. Isso requer bash ou ksh ou zsh, não funciona em sh simples, mas a sintaxe {...} tem esses requisitos de qualquer maneira.

call_yii () {
  typeset YII_ENV=prod
  export YII_ENV
  for x in {1..10}; do yii kw/test; done
}
    
por 28.02.2016 / 21:59