
Estou tentando replicar o código deaqui
Por alguma razão, não funciona no meu computador. A saída, em vez do valor numérico, é o próprio comando.
apple$ x='echo "var=500;var%=7;var"|bc'
apple$ $x
"var=500;var%=7;var"|bc
Eu gostaria de saber por que isso acontece. O que eu fiz de errado?
Responder1
A fonte usa crases ( `
) para indicar substituição de comando. O comando especificado entre crases é executado e o resultado é colocado em seu lugar. Neste caso, é uma simples atribuição de variável, portanto o resultado do comando é atribuído à variável.
Isso é fácil de ver com a -x
opção de bash:
$ x=`echo "var=500;var%=7;var"|bc`
++ echo 'var=500;var%=7;var'
++ bc
+ x=3
Em vez dos caracteres de crase, você usou aspas simples. Aspas simples instruem o shell a manter o valor literal e não aplicar nenhum tipo de processamento ao seu conteúdo. Como resultado, o comando é atribuído como está à variável. Esta é a -x
saída correspondente:
$ x='echo "var=500;var%=7;var"|bc'
+ x='echo "var=500;var%=7;var"|bc'
Por último, para imprimir o conteúdo da variável, você deve usar echo
ou printf
. Quando o valor de 'x' é 3, a execução $x
geraria uma -bash: 3: command not found
mensagem de erro. A execução $x
funcionou no seu caso apenas porque o echo
comando fazia parte do conteúdo da variável.
Responder2
Como Haxiel observou, em vez dos caracteres de crase, você provavelmente usou aspas simples. Mas melhor do que usar crases( `
) eu sugiro que você use $()
. Os backticks estão obsoletos e $()
são compatíveis com POSIX.
No seu exemplo você poderia fazer:
x=$(echo "var=500;var%=7;var" | bc)
echo "$x"
Ou em uma linha:
echo "var=500;var%=7;var" | bc