私のプログラムは
#!/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"
しかし、いくら努力しても期待した結果は得られません。今私は
$ . 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
答え1
あなたはあなたがやっていると思うことをしていません。このコマンドは次のとおりです。
TAX="echo $salary * 0.15 | bc"
何も実行されず、計算も行われません。これにより、変数に文字列が割り当てられます$TAX
。その後、変数をに渡すときに変数を引用しなかったため、現在のディレクトリ内のすべての項目に展開されますprintf
。*
表示するには:
$ ls
file1 file2
foo="echo 12 * 4 | bc"
$ echo $foo
echo 12 file1 file2 4 | bc
上記のように、*
拡張はディレクトリの内容で行われ、計算は行われません。コマンドの結果を変数に割り当てるには、var=$(command)
引用符の代わりに使用する必要があります。
したがって、スクリプトの作業バージョンは次のようになります。
#!/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
何かをデバッグするときは、変数に含まれる内容を理解するために常に変数の印刷を検討する必要があります。