이제 여러분은 셸 스크립트를 이해하고 필요에 따라 능숙하게 작성할 수 있는 수준에 이르렀을 것입니다. 이번 글은 셸 스크립팅 튜토리얼 시리즈의 마지막 편으로, 스크립팅 언어를 활용해 다소 복잡한 수학 연산을 수행하는 방법을 다룹니다. 앞서 진행된 셸 스크립팅 시리즈의 네 가지 글은 아래와 같습니다.
- 리눅스 기본 셸 스크립팅 언어 팁 이해하기 – 파트 I
- 리눅스 초보자를 위한 5가지 셸 스크립트 예제 – 파트 II
- 리눅스 BASH 스크립팅 세계 탐험하기 – 파트 III
- 리눅스 셸 프로그래밍의 수학적 접근 – 파트 IV
피보나치 수열부터 시작하기
피보나치 수열은 각 숫자가 앞의 두 숫자의 합으로 이루어지는 수열입니다. 즉, 0, 1, 1, 2, 3, 5, 8… 과 같은 형태이며, 정의상 수열의 처음 두 숫자는 0과 1입니다.
스크립트 1: Fibonacci.sh
#!/bin/bash
echo "How many numbers do you want of Fibonacci series ?"
read total
x=0
y=1
i=2
echo "Fibonacci Series up to $total terms :: "
echo "$x"
echo "$y"
while [ $i -lt $total ]
do
i=`expr $i + 1 `
z=`expr $x + $y `
echo "$z"
x=$y
y=$z
done실행 결과 예시
[admin@wsxdn.com ~]# chmod 755 Fibonacci.sh [admin@wsxdn.com ~]# ./Fibonacci.sh How many numbers do you want of Fibonacci series ? 10 Fibonacci Series up to 10 terms :: 0 1 1 2 3 5 8 13 21 34
10진수를 2진수로 변환하기
컴퓨터는 오직 0과 1로 구성된 2진수 형식만 이해한다는 사실은 이미 잘 알고 계실 것입니다. 그리고 대부분의 분들이 10진수를 2진수로 변환하는 방법을 배우며 즐거움을 느꼈던 기억도 있으실 겁니다. 이 복잡한 변환 작업을 간단한 스크립트로 구현해 보면 어떨까요?
스크립트 2: Decimal2Binary.sh
#!/bin/bash
for ((i=32;i>=0;i--)); do
r=$(( 2**$i))
Probablity+=( $r )
done
[[ $# -eq 0 ]] && echo -en "Decimal\t\tBinary\n"
for input_int in admin@wsxdn.com; do
s=0
test ${#input_int} -gt 11 && printf "%-10s\t" "$input_int"
for n in ${Probablity[@]}; do
if [[ $input_int -lt ${n} ]]; then
[[ $s = 1 ]] && printf "%d" 0
else
printf "%d" 1 ; s=1
input_int=$(( $input_int - ${n} ))
fi
done
echo -e
done실행 결과 예시
[admin@wsxdn.com ~]# chmod 755 Decimal2Binary.sh [admin@wsxdn.com ~]# ./Decimal2Binary.sh 1121 Decimal Binary 1121 10001100001
참고: 위 스크립트는 실행 시점에 입력값을 받아들이므로 활용하기 매우 편리합니다.
bc 명령어로 한 줄 변환하기
사실 내장 명령어인 bc를 사용하면 단 한 줄의 코드로 10진수를 2진수로 변환할 수 있습니다. 터미널에서 다음과 같이 실행해 보세요.
[admin@wsxdn.com ~]# echo "obase=2; NUM" | bc
NUM 부분을 변환하고자 하는 10진수 값으로 바꾸면 됩니다. 예를 들어 다음과 같습니다.
[admin@wsxdn.com ~]# echo "obase=2; 121" | bc 1111001
2진수를 10진수로 변환하기
이번에는 위 스크립트와 반대되는 기능, 즉 2진수 값을 10진수로 변환하는 스크립트를 작성해 보겠습니다.
스크립트 3: Binary2Decimal.sh
#!/bin/bash echo "Enter a number :" read Binary if [ $Binary -eq 0 ] then echo "Enter a valid number " else while [ $Binary -ne 0 ] do Bnumber=$Binary Decimal=0 power=1 while [ $Binary -ne 0 ] do rem=$(expr $Binary % 10 ) Decimal=$((Decimal+(rem*power))) power=$((power*2)) Binary=$(expr $Binary / 10) done echo " $Decimal" done fi
실행 결과 예시
[admin@wsxdn.com ~]# chmod 755 Binary2Decimal.sh [admin@wsxdn.com ~]# ./Binary2Decimal.sh Enter a number : 11 3
참고: 위와 동일한 변환은 터미널에서 bc 명령어를 사용해 간단히 수행할 수도 있습니다.
[admin@wsxdn.com ~]# echo "ibase=2; BINARY" | bc
BINARY 부분을 2진수 값으로 바꿔주면 됩니다. 예시는 다음과 같습니다.
[admin@wsxdn.com ~]# echo "ibase=2; 11010101" | bc 213
다양한 진법 변환 응용
같은 원리로 8진수, 16진수와 10진수 간의 상호 변환 스크립트도 직접 작성할 수 있습니다. 참고로 bc 명령어를 사용하면 터미널에서 바로 결과를 얻을 수 있습니다.
10진수 → 8진수
[admin@wsxdn.com ~]# echo "obase=8; Decimal" | bc
10진수 → 16진수
[admin@wsxdn.com ~]# echo "obase=16; Decimal" | bc
8진수 → 10진수
[admin@wsxdn.com ~]# echo "ibase=8; Octal" | bc
16진수 → 10진수
[admin@wsxdn.com ~]# echo "ibase=16; Hexadecimal" | bc
2진수 → 8진수
[admin@wsxdn.com ~]# echo "ibase=2;obase=8 Binary" | bc
셸 스크립트에서 자주 쓰이는 숫자 비교 연산자
셸 스크립팅 언어에서 자주 사용되는 주요 숫자 비교 테스트와 그 의미는 다음과 같습니다.
Test : INTEGER1 -eq INTEGER2 Meaning: INTEGER1과 INTEGER2가 같음
Test : INTEGER1 -ge INTEGER2 Meaning: INTEGER1이 INTEGER2보다 크거나 같음
Test: INTEGER1 -gt INTEGER2 Meaning: INTEGER1이 INTEGER2보다 큼
Test: INTEGER1 -le INTEGER2 Meaning: INTEGER1이 INTEGER2보다 작거나 같음
Test: INTEGER1 -lt INTEGER2 Meaning: INTEGER1이 INTEGER2보다 작음
Test: INTEGER1 -ne INTEGER2 Meaning: INTEGER1과 INTEGER2가 같지 않음
이것으로 이번 글과 셸 스크립팅 시리즈 전체를 마무리합니다. 시리즈가 끝났다고 해서 앞으로 스크립팅 관련 글을 다루지 않겠다는 의미는 아닙니다. 셸 스크립팅 튜토리얼은 여기까지이며, 앞으로 흥미로운 주제나 여러분의 질문이 있을 때마다 이 시리즈를 이어가게 될 것입니다.
항상 건강하시고, Tecmint와 계속 소통해 주세요. 곧 여러분이 즐겁게 읽으실 또 다른 흥미로운 주제로 돌아오겠습니다. 소중한 생각과 의견을 댓글로 남겨주세요.