shell script 정수 연산을 해 봅시다.

OS/리눅스 2022. 9. 1. 07:30

 쉘 프로그래밍을 하다가 수 연산을 해야 될 때가 있었습니다. 이럴 때 어떻게 해야 할까요?

 


 bash 메뉴얼 문서를 보면, $(( expression )), (( compound 방법을 소개하고 있습니다.

 

  이에 따르면 expression은 $a+$b가 됩니다. a는 3이므로, $a는 3으로 대치됩니다. 그리고, $b는 4로 대치됩니다. 즉, 우리는 3 + 4가 (( 안에 있기 때문에, 3 + 4를 산술 연산으로 평가하게 됩니다.3 + 4는 유효한 산술 표현식이므로 결과적으로 7이 리턴됩니다.

 

 결과를 출력해 보니, 정말 그러하네요.

 

 그러면 이건 어떨까요? 3+4라는 expression이 있습니다. ((로 감싸져 있으므로, 3+4가 산술 연산식으로 평가됩니다. 따라서, c는 3+4의 산술 연산 결과값인 7이 들어가게 됩니다.

 

 

  7이 출력됨을 알 수 있습니다.

 

 


 그러면, 이걸 활용해서 문제를 하나 풀어봅시다. 메이플에서 방어율이 있습니다. 그리고 방어율 무시가 있습니다. 내가 느끼는 체감 방어율이 또 있겠죠? 방어율에서 일정 %만큼 무시하고 남은 수치를 내가 느끼는 체감 방어율이라 합니다. 예를 들어 방어율이 200이고, 방무가 40이라면 체감 방어율은 200에서 200의 40%인 80만큼 뺀 120이 실 체감 방어율이 됩니다.

 

 그런데, 메이플에서 내가 느끼는 체감 방어율이 100보다 크거나 같으면 데미지를 줄 수 없습니다. 자. 방어율과 방무가 주어졌을 때, 내가 몹에게 데미지를 줄 수 있는지 없는지 어떻게 구하면 될까요?

 

 

 이렇게 간단하게 구할 수 있는데요. 하나씩 보겠습니다. 먼저, $1과 $2는 각각 argument의 1번째, 2번째 인자를 의미합니다. 1번째, 2번째 인자라. 어떤 것을 의미할까요?

 

 

 #은 bash shell에서 인자의 개수를 나타내는 특별한 변수입니다.

 

 

 source ./test3.sh 1 3 5를 입력하면 3이 출력됩니다. source ./test3.sh 1 3을 하면 2가 출력됩니다. 추가로 준 인자가 각각 3개, 2개였다는 의미입니다. 그리고 이러한 argument가 N개 있으면 $1, $2, ..., $N의 순서대로 출력됩니다. 고로, $1, $2의 의미는 추가로 준 인자의 1번째, 2번째 인자라는 의미입니다.

 

 이제 다시 문제로 돌아와 봅시다.

 

 

 이 경우, $1은 500, $2는 80이라는 걸 위의 결과에서 유추해 볼 수 있습니다.

 

 

 이제 안쪽을 해석해 봅시다. $(( 로 감싸져 있으니, 2번째 줄의 식을 산술식으로 평가합니다. $1은 500, 즉 방어율이고 $2는 80, 방무입니다. 즉 방어율*(100-방무) < 1만이라면 1, 아니면 0이 나오는 수식입니다. 이는 (방어율 * (100 - 방무))/100이 100보다 작은 경우에, 몬스터에게 데미지를 가할 수 있는데요. 양변에 100을 곱하면 방어율 * (100 - 방무) < 10000 이라면 몹에게 뎀지를 줄 수 있다는 결론이 나오기 때문입니다. 양수를 곱했기 때문에 부등호 방향은 바뀌지 않습니다.