bash + bash를 사용한 산술 계산

bash + bash를 사용한 산술 계산

Bash를 사용하여 다음 작업을 수행해야 합니다. 우아한 방법은 무엇입니까? 최종 $sum 값을 가져옵니다.

worker_machine=32
executors_per_node=3

executer=$worker_machine/$executors_per_node-1
spare=$executer X 0.07 
sum=$executer-$spare ( with round the number to down ) 

example:

32/3 = 10 - 1 = 9
9 X 0.7 = 0.6
9 – 0.6 = 8 ( with round the number to down ) 

답변1

을 사용하여 awk쉘 변수에서 값을 가져옵니다.

awk -v n="$worker_machine" -v m="$executors_per_node" \
    'BEGIN { printf("%d\n", 0.93 * (n / m - 1)) }' /dev/null

스크립트 awk는 평소처럼 어떤 입력도 받지 않으므로 /dev/null파일을 입력으로 사용하고 블록 단위로 계산과 출력을 수행합니다 BEGIN.

사용 bc:

sum=$( printf '0.93 * (%d / %d - 1)\n' "$worker_machine" "$executors_per_node" | bc )
printf '%.0f\n' "$sum"

사용 dc:

sum=$( printf '%d\n%d\n/\n1\n-\n0.93\n*\np\n' "$worker_machine" "$executors_per_node" | dc )
printf '%.0f\n' "$sum"

답변2

쉘은 수학 연산(정수, 반내림)을 수행할 수 있습니다.

$ sum=$(( ( worker_machine/executors_per_node-1 ) * 93 / 100 ))
$ echo "$sum"
8

bc의 기본 소수 자릿수는 0이므로 나누기 결과는 정수가 됩니다.

$ sum=$(bc <<<"($worker_machine / $executors_per_node - 1)*93/100")
$ echo "$sum"
8

우리는 정수를 원하므로 awk에 정수를 요청할 수 있습니다.

$ sum=$(awk -v m="$worker_machine" -v n="$executors_per_node" 'BEGIN{ print( int((m/n-1)*93/100) )}' /dev/null)
$ echo "$sum"
8

관련 정보