Como usar printf para mostrar os resultados de um cálculo?

3

Meu programa é

#!/bin/sh
printf 'Please enter salary amount: '
read salary
TAX="echo $salary * 0.15 | bc"
NET="echo $salary + $TAX | bc"

printf "Net Salary= %.2f" $NET
printf "\n"

Mas qualquer coisa que eu tente, não consigo obter a saída esperada. Agora estou recebendo

$ . 3_net_salary.sh 
Please enter salary amount: 300
-bash: printf: echo: invalid number
-bash: printf: +: invalid number
-bash: printf: echo: invalid number
-bash: printf: 1_simple.awk: invalid number
-bash: printf: 1_simple_awk.sh: invalid number
-bash: printf: 2_simple_awk.sh: invalid number
-bash: printf: 2_simple_before.awk: invalid number
-bash: printf: 3_net_salary.sh: invalid number
-bash: printf: 4_purchase_amounts.sh: invalid number
-bash: printf: alert_spec.rb: invalid number
-bash: printf: awk_passwd.sh: invalid number
-bash: printf: numbers.txt: invalid number
-bash: printf: sed_to_change_should_syntax_to_expect-to: invalid number
-bash: printf: should_to_expect: invalid number
-bash: printf: t1_spec.rb: invalid number
-bash: printf: test001.txt: invalid number
-bash: printf: test_1_spec.rb: invalid number
-bash: printf: test_2_spec.rb: invalid number
-bash: printf: |: invalid number
-bash: printf: bc: invalid number
-bash: printf: |: invalid number
-bash: printf: bc: invalid number
Net Salary= 0.00Net Salary= 300.00Net Salary= 0.00Net Salary= 0.00Net Salary= 300.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.15Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00Net Salary= 0.00
    
por Michael Durrant 30.11.2014 / 16:48

1 resposta

8

Você não está fazendo o que acha que está fazendo. Este comando:

TAX="echo $salary * 0.15 | bc"

Não roda nada, não há cálculo. Isso atribui uma string à variável $TAX . Então, como você não está citando a variável quando a passa para printf , o * expandirá para tudo no diretório atual. Para ilustrar:

$ ls
file1  file2
foo="echo 12 * 4 | bc"
$ echo $foo
echo 12 file1 file2 4 | bc

Como você pode ver acima, o * foi expandido para o conteúdo do diretório e nenhum cálculo foi feito. Para atribuir o resultado de um comando a uma variável, você deve usar var=$(command) , não aspas.

Então, uma versão funcional do seu script seria:

#!/bin/sh
printf 'Please enter salary amount: '
read salary
TAX=$(printf '%s * %s\n' "$salary" "0.15" | bc)
NET=$(printf '%s + %s\n' "$salary" "$TAX" | bc)

printf "Net Salary= %.2f\n" $NET

Ao depurar algo, você deve sempre pensar em imprimir suas variáveis para entender o que elas contêm.

    
por 30.11.2014 / 17:03