Shell Bash: Como atribuir um resultado calculado bc a uma variável e imprimi-lo?

Shell Bash: Como atribuir um resultado calculado bc a uma variável e imprimi-lo?

Estou tentando replicar o código deaquiinsira a descrição da imagem aqui

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 -xopçã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 -xsaí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 echoou printf. Quando o valor de 'x' é 3, a execução $xgeraria uma -bash: 3: command not foundmensagem de erro. A execução $xfuncionou no seu caso apenas porque o echocomando 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

informação relacionada