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.