printf를 사용하여 계산 결과를 표시하는 방법은 무엇입니까?

printf를 사용하여 계산 결과를 표시하는 방법은 무엇입니까?

내 프로그램은

#!/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

무언가를 디버깅할 때 변수에 포함된 내용을 이해하기 위해 항상 변수 인쇄를 고려해야 합니다.

관련 정보