atribuição de variável dentro de um script bash

1

Isto é obviamente um SSCCE, por isso não faz (em si) sentido algum. Por exemplo. a atribuição de variável para Y não é usada neste exemplo mínimo; Eu só estou tentando descobrir a sintaxe correta para usar no meu caso atual.

Eu posso fazer o seguinte diretamente no shell bash:

Y=10 echo foo

Eu também posso ter o seguinte em um arquivo bash foo.sh :

#!/bin/bash
X="echo foo"
$X

... e depois faça um:

$./foo.sh
foo

No entanto, quando tenho o seguinte em um arquivo bash:

#!/bin/bash
X="Y=10 echo foo"
$X

... então, eu recebo:

$ ./foo.sh 
./foo.sh: line 3: Y=10: command not found

Qual é a sintaxe correta para usar acima?

    
por Marcus Junius Brutus 09.09.2014 / 23:03

4 respostas

4

O problema é que as atribuições de parâmetros opcionais são reconhecidas antes da expansão do parâmetro, então a linha

$X

é reconhecido como um comando sem atribuições anteriores. A primeira palavra do resultado da expansão é assumida como sendo o nome do comando, portanto, o shell tenta executar Y=10 .

Como geralmente é o caso, você não deve tentar armazenar código em uma variável, mas sim em uma função.

X () {
    Y=10 echo foo
}
    
por 09.09.2014 / 23:11
0

Descobrimos que o que eu descrevo abaixo é apenas um artefato do exemplo mínimo, que deixa de fora a parte em que Y é usado.

Existe uma atribuição de variável antes do comando na linha:

Y=10 echo foo

A atribuição definirá a variável Y to 10 durante a execução de echo foo . Como echo foo não usa Y , a atribuição não tem efeito.

Em todas as variantes deste comando na pergunta e nas respostas, é o mesmo - o Y=10 não tem efeito.

    
por 10.09.2014 / 00:33
0

Se você precisar fazer isso, use env :

$ X='env Y=10 echo foo'
foo

... e para demonstrar $Y ...

$ X='env Y=10 env'
$ $X | grep \^Y
Y=10

... mas uma função é melhor.

    
por 10.09.2014 / 10:42
-1

A maneira de obter um comando a ser analisado novamente após a expansão do parâmetro é

X="Y=10 echo foo"
eval "$X"

Estou assumindo que você tem uma razão realista para querer fazer isso.

    
por 09.09.2014 / 23:41

Tags