Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Linux 셸 스크립트로 배우는 수학 연산 – 셸 스크립팅 시리즈 4편

이번 글에서는 수학숫자 관점에서 활용할 수 있는 셸 스크립트를 다뤄보겠습니다. 이전 글에서 다소 복잡한 간단 계산기(Simple Calculator) 스크립트를 소개했지만, 초보자 입장에서는 이해하기 어려웠을 수 있습니다. 그래서 이번에는 작은 단위로 나누어, 하나씩 차근차근 익힐 수 있는 유용한 스크립트들을 준비했습니다.

이 글에 앞서 셸 스크립팅 시리즈의 세 편이 이미 공개되어 있으니, 아직 읽지 않으셨다면 먼저 확인해 보시길 권합니다.

  1. Linux 셸과 기본 셸 스크립팅 이해하기 – 1편
  2. 셸 프로그래밍을 배우는 5가지 셸 스크립트 – 2편
  3. Linux BASH 스크립팅의 세계 항해하기 – 3편

그럼 새롭고 흥미로운 스크립트들과 함께 학습을 이어가 보겠습니다. 첫 번째는 수학 스크립트입니다.

스크립트 1: 덧셈(Addition)

"Addition.sh" 파일을 생성하고, 앞선 글에서 설명한 대로 chmod 755로 실행 권한을 부여한 뒤 실행합니다.

#!/bin/bash
echo "Enter the First Number: " 
read a 
echo "Enter the Second Number: " 
read b 
x=$(expr "$a" + "$b") 
echo $a + $b = $x

실행 결과 예시

[admin@wsxdn.com ~]# vi Additions.sh
[admin@wsxdn.com ~]# chmod 755 Additions.sh
[admin@wsxdn.com ~]# ./Additions.sh

Enter the First Number: 
12
Enter the Second Number: 
13
12 + 13 = 25

여기서는 expr 명령어를 사용해 두 수의 합을 변수 x에 저장한 후 출력했습니다.

스크립트 2: 뺄셈(Substraction)

#!/bin/bash
echo "Enter the First Number: " 
read a 
echo "Enter the Second Number: " 
read b 
x=$(($a - $b)) 
echo $a - $b = $x

참고: 이번에는 expr 대신 셸 자체의 산술 확장 $(())을 사용해 계산을 수행했습니다. 두 방식 모두 결과는 동일하지만, 셸 내장 연산이 더 간결하고 빠릅니다.

실행 결과 예시

[admin@wsxdn.com ~]# vi Substraction.sh
[admin@wsxdn.com ~]# chmod 755 Substraction.sh
[admin@wsxdn.com ~]# ./Substraction.sh

Enter the First Number: 
13
Enter the Second Number: 
20
13 - 20 = -7

스크립트 3: 곱셈(Multiplication)

지금까지 어렵지 않게 따라오고 계실 텐데요, 이번 순서는 당연히 곱셈입니다.

#!/bin/bash
echo "Enter the First Number: " 
read a 
echo "Enter the Second Number: " 
read b 
echo "$a * $b = $(expr $a \* $b)"

참고: 여기서는 곱셈 결과를 별도의 변수에 담지 않고, 출력문 안에서 바로 계산했습니다. 주의할 점은 *가 와일드카드로 해석되지 않도록 역슬래시(\*)로 이스케이프해야 한다는 것입니다.

실행 결과 예시

[admin@wsxdn.com ~]# vi Multiplication.sh
[admin@wsxdn.com ~]# chmod 755 Multiplication.sh
[admin@wsxdn.com ~]# ./Multiplication.sh

Enter the First Number: 
11
Enter the Second Number: 
11
11 * 11 = 121

스크립트 4: 나눗셈(Division)

좋습니다! 다음은 나눗셈입니다. 역시 아주 간단한 스크립트이니 직접 확인해 보세요.

#!/bin/bash
echo "Enter the First Number: " 
read a 
echo "Enter the Second Number: " 
read b 
echo "$a / $b = $(expr $a / $b)"

참고: expr의 나눗셈은 정수 나눗셈만 지원하므로, 소수점 이하는 버려집니다. 예를 들어 7 / 2의 결과는 3이 됩니다.

실행 결과 예시

[admin@wsxdn.com ~]# vi Division.sh
[admin@wsxdn.com ~]# chmod 755 Division.sh
[admin@wsxdn.com ~]# ./Division.sh

Enter the First Number: 
12
Enter the Second Number: 
3
12 / 3 = 4

스크립트 5: 구구단 출력(Table)

좋아요! 기본적인 사칙연산 다음으로는, 입력받은 숫자의 배수(구구단)를 출력하는 스크립트를 작성해 보겠습니다.

#!/bin/bash
echo "Enter The Number upto which you want to Print Table: " 
read n 
i=1 
while [ $i -ne 10 ] 
do 
i=$(expr $i + 1) 
table=$(expr $i \* $n) 
echo $table 
done

참고: 이 스크립트는 입력받은 숫자 n에 대해 2배부터 10배까지의 값을 차례로 출력합니다. 반복문 안에서 i를 먼저 증가시킨 뒤 곱셈을 수행하기 때문에, 1배(n)는 출력되지 않는 점에 유의하세요.

실행 결과 예시

[admin@wsxdn.com ~]# vi Table.sh
[admin@wsxdn.com ~]# chmod 755 Table.sh
[admin@wsxdn.com ~]# ./Table.sh

Enter The Number upto which you want to Print Table: 
29
58
87
116
145
174
203
232
261
290

스크립트 6: 홀짝 판별(EvenOdd)

어릴 때 누구나 어떤 숫자가 홀수인지 짝수인지 계산해 본 적이 있을 겁니다. 이 로직을 스크립트로 구현하면 어떨까요?

#!/bin/bash
echo "Enter The Number" 
read n 
num=$(expr $n % 2) 
if [ $num -eq 0 ] 
then 
echo "is a Even Number" 
else 
echo "is a Odd Number" 
fi

핵심은 나머지 연산자 %입니다. 2로 나눈 나머지가 0이면 짝수, 그렇지 않으면 홀수로 판별합니다.

실행 결과 예시

[admin@wsxdn.com ~]# vi EvenOdd.sh
[admin@wsxdn.com ~]# chmod 755 EvenOdd.sh
[admin@wsxdn.com ~]# ./EvenOdd.sh

Enter The Number
12
is a Even Number
[admin@wsxdn.com ~]# ./EvenOdd.sh

Enter The Number
11
is a Odd Number

스크립트 7: 팩토리얼(Factorial)

다음은 팩토리얼을 구하는 스크립트입니다.

#!/bin/bash 
echo "Enter The Number" 
read a 
fact=1 
while [ $a -ne 0 ] 
do 
fact=$(expr $fact \* $a) 
a=$(expr $a - 1) 
done 
echo $fact

실행 결과 예시

[admin@wsxdn.com ~]# vi Factorial.sh
[admin@wsxdn.com ~]# chmod 755 Factorial.sh
[admin@wsxdn.com ~]# ./Factorial.sh

Enter The Number
12
479001600

이제 12×11×10×9×8×7×6×5×4×3×2×1을 손으로 계산하는 것이 위의 간단한 스크립트보다 훨씬 어렵다는 사실을 실감하실 겁니다. 99!처럼 큰 숫자의 팩토리얼을 구해야 하는 상황을 생각해 보세요. 이런 경우에 이 스크립트가 매우 유용하게 쓰일 것입니다.

스크립트 8: 암스트롱 수(Armstrong)

암스트롱 수(Armstrong Number)! 잊으셨나요? 세 자리 암스트롱 수란, 각 자리 숫자의 세제곱의 합이 그 수 자신과 같은 정수를 말합니다. 예를 들어 3713³ + 7³ + 1³ = 371이므로 암스트롱 수입니다.

#!/bin/bash 
echo "Enter A Number" 
read n 
arm=0 
temp=$n 
while [ $n -ne 0 ] 
do 
r=$(expr $n % 10) 
arm=$(expr $arm + $r \* $r \* $r) 
n=$(expr $n / 10) 
done 
echo $arm 
if [ $arm -eq $temp ] 
then 
echo "Armstrong" 
else 
echo "Not Armstrong" 
fi

스크립트의 동작 원리는 다음과 같습니다. % 10으로 마지막 자리 숫자를 하나씩 추출하고, 그 숫자의 세제곱을 누적합에 더한 뒤, / 10으로 해당 자리를 제거하는 과정을 모든 자리에 대해 반복합니다. 최종적으로 누적합이 원래 입력값과 같으면 암스트롱 수로 판정합니다.

실행 결과 예시

[admin@wsxdn.com ~]# vi Armstrong.sh
[admin@wsxdn.com ~]# chmod 755 Armstrong.sh
[admin@wsxdn.com ~]# ./Armstrong.sh

Enter A Number
371
371
Armstrong
[admin@wsxdn.com ~]# ./Armstrong.sh

Enter A Number
123
36
Not Armstrong

스크립트 9: 소수 판별(Prime)

마지막 스크립트는 입력받은 숫자가 소수인지 아닌지를 판별합니다.

#!/bin/bash 
echo "Enter Any Number"
read n
i=1
c=1
while [ $i -le $n ]
do
i=$(expr $i + 1)
r=$(expr $n % $i)
if [ $r -eq 0 ]
then
c=$(expr $c + 1)
fi
done
if [ $c -eq 2 ]
then
echo "Prime"
else
echo "Not Prime"
fi

이 스크립트는 1부터 n까지의 모든 수로 n을 나누어, 나머지가 0이 되는 경우(약수)의 개수를 셉니다. 약수의 개수가 정확히 2개(1과 자기 자신)라면 소수입니다.

실행 결과 예시

[admin@wsxdn.com ~]# vi Prime.sh
[admin@wsxdn.com ~]# chmod 755 Prime.sh
[admin@wsxdn.com ~]# ./Prime.sh

Enter Any Number
12
Not Prime

오늘은 여기까지입니다. 다음 글에서는 셸 스크립팅 언어로 작성하는 또 다른 수학 프로그램들을 다룰 예정입니다. 글에 대한 의견을 댓글로 남겨 주시고, 좋아요와 공유로 널리 알려 주시면 큰 힘이 됩니다. FOSS 관련 뉴스와 기사는 tecmint.com에서 확인하세요. 그때까지 기대해 주세요!