이번 글에서는 수학과 숫자 관점에서 활용할 수 있는 셸 스크립트를 다뤄보겠습니다. 이전 글에서 다소 복잡한 간단 계산기(Simple Calculator) 스크립트를 소개했지만, 초보자 입장에서는 이해하기 어려웠을 수 있습니다. 그래서 이번에는 작은 단위로 나누어, 하나씩 차근차근 익힐 수 있는 유용한 스크립트들을 준비했습니다.
이 글에 앞서 셸 스크립팅 시리즈의 세 편이 이미 공개되어 있으니, 아직 읽지 않으셨다면 먼저 확인해 보시길 권합니다.
- Linux 셸과 기본 셸 스크립팅 이해하기 – 1편
- 셸 프로그래밍을 배우는 5가지 셸 스크립트 – 2편
- 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)! 잊으셨나요? 세 자리 암스트롱 수란, 각 자리 숫자의 세제곱의 합이 그 수 자신과 같은 정수를 말합니다. 예를 들어 371은 3³ + 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에서 확인하세요. 그때까지 기대해 주세요!