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

쉘 스크립트로 수학 표현식 계산하기 – 피보나치 수열부터 진법 변환까지 (파트 V)

이제 여러분은 셸 스크립트를 이해하고 필요에 따라 능숙하게 작성할 수 있는 수준에 이르렀을 것입니다. 이번 글은 셸 스크립팅 튜토리얼 시리즈의 마지막 편으로, 스크립팅 언어를 활용해 다소 복잡한 수학 연산을 수행하는 방법을 다룹니다. 앞서 진행된 셸 스크립팅 시리즈의 네 가지 글은 아래와 같습니다.

  1. 리눅스 기본 셸 스크립팅 언어 팁 이해하기 – 파트 I
  2. 리눅스 초보자를 위한 5가지 셸 스크립트 예제 – 파트 II
  3. 리눅스 BASH 스크립팅 세계 탐험하기 – 파트 III
  4. 리눅스 셸 프로그래밍의 수학적 접근 – 파트 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진수로 변환하기

컴퓨터는 오직 01로 구성된 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와 계속 소통해 주세요. 곧 여러분이 즐겁게 읽으실 또 다른 흥미로운 주제로 돌아오겠습니다. 소중한 생각과 의견을 댓글로 남겨주세요.