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