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.