Se você quiser o que disse você queria:
export STY="for i in {0..3}; do echo \$i; done"
Se você quer o que você provavelmente quis dizer:
function STY() {
for i in {0..3}; do echo $i; done
}
export -f STY
Desejo exportar uma variável de ambiente cujo valor contenha uma variável, mas não quero que essa variável (que está dentro do valor) seja avaliada durante o processo de exportação. ou seja,
export STY=for i in {0..3}; do echo $i; done
então, minha exigência é que, quando eu fizer eco a STY, a saída que eu preciso seja
echo $STY
for i in {0..3}; do echo $i; done
Mas $ i é avaliado durante a exportação. Eu preciso preservar como é.
Se você quiser o que disse você queria:
export STY="for i in {0..3}; do echo \$i; done"
Se você quer o que você provavelmente quis dizer:
function STY() {
for i in {0..3}; do echo $i; done
}
export -f STY
Curto: use eval "$ hello".
(Esta resposta originalmente dizia: use eval $ ola mas outro pôster apontou que eval "$ hello" é mais seguro.
Como mostrado abaixo:
bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'
Simplesmente dizer $ hello no início de uma linha não funciona - porque os loops são processados antes da expansão $ variable (linguagens orientadas para fase, eu os odeio):
bash-2.05a$ $hello
bash: for: command not found
Mas a avaliação funciona:
bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$
O que você estava (ou poderia ter feito) errado:
bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$
Ou seja. pelo menos na versão do bash que estou usando, {0..4} não faz o que você achou que deveria.
Olink diz que o recurso {0..4} veio no bash 3.0 +.
Talvez você, como eu (no woprk, não em casa), esteja usando uma versão obsoleta do bash?
O motivo pelo qual $hello
não é executado como esperado:
for...do...done
é um Compound Command
que é determinado no estágio de tokenlize. for
não é um comando. Então, você não pode fazer isso:
$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token 'do'
Quando o bash divide a linha de comando em tokens, ele vê "for"
não for
, então token do
é inesperado.
No seu caso:
$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found
O Bash encontra um token $hello
e, em seguida, variable-expansion
& & word-spliting
em ordem.
Na verdade, o bash analisa o resultado como Simple Command
:
for
) recebe o descanso como args ( i
, in
, {0..4}
, ;
, do
, ...) for
, do
, ;
, done
, etc perderam seus significados especiais. O problema tem dois lados:
Para armazenar expressões, seqüências de escape e citações especiais podem ser necessárias (o que parece estar correto em seu exemplo). A execução pode ser executada de duas maneiras:
eval $STY
para a definição de variável fornecida no seu exemplo