Como executar uma string com valores como um comando no bash?

4

Aqui está o meu pequeno trecho de script.

i=5
command='echo $i'
$command

Eu quero que este script imprima 5 , ou seja, eu quero que ele execute echo e imprima 5. Mas, em vez disso, ele continua imprimindo $i . Então, como vou resolver isso?

    
por posixKing 07.04.2017 / 11:07

1 resposta

6

Isso seria:

eval "$command"

Se você quiser que o conteúdo de $command seja avaliado como código de shell.

Se você não pode garantir que $command não comece com - (o que causaria eval em alguns shells como bash para tratá-lo como uma opção), você pode querer executar:

eval " $command"

em vez disso. Esse espaço extra extra não afetará a maneira como o comando é analisado e impedirá que $command seja tratado como uma opção para eval se começar com - . eval -- "$command" também funcionaria em alguns shells (incluindo bash ), mas não é POSIX (IIRC) e não funcionaria em dash ou o shell Bourne, por exemplo.

Observe que seu $command provavelmente deve ser:

command='echo "$i"'

A menos que você pretenda que $i esteja sujeito a divisão + glob

Uma forma potencialmente melhor de armazenar código em "variáveis" seria usar funções:

mycommand() { echo "$i"; }

(usando mycommand em vez de command , já que command já é um comando existente).

Se $command for break / continue / return , o comportamento variará dependendo do shell.

Se você quiser que $command armazene um comando simples , essa é uma lista de palavras, a primeira das quais é consultada como o comando a ser executado com a lista de palavras como argumentos, você d use uma variável de matriz:

command=('echo' '$i' "$i")
"${command[@]}"

Isso executaria echo , com echo , $i e o conteúdo de $i como argumentos.

command='echo $i ;x /* '$i
$command

(com o valor padrão de $IFS ) é o que faria o menor sentido. Lá, $command conteria uma string. O primeiro $i deixado como está, o segundo expandido (como fora das aspas simples) e, em seguida, essa cadeia estaria sujeita a split + glob (como $command não está entre aspas duplas), cujo resultado resultaria em um número de palavras, tomadas como um comando simples novamente.

    
por 07.04.2017 / 11:08