이 프로그램은 bash shell script언어를 이용하여 월, 일을 입력받아 해당 날짜가 무슨 요일인지 출력하는 프로그램이다.

1900년 1월 1일이 월요일이기 때문에 그 때부터 입력받은 날짜까지 지난 일 수를 구하여 7로 나누었을 때의 나머지를 통해 요일을 구할 수 있다. 소스코드는 다음과 같다.

#!/bin/bash
echo -n "type month date : "
read month date
let year=2021-1900
let sum=$year*365
let sum+=$year/4
case $month in
	"1") let sum+=0;;
	"2") let sum+=31;;
	"3") let sum+=59;;
	"4") let sum+=90;;
	"5") let sum+=120;;
	"6") let sum+=151;;
	"7") let sum+=181;;
	"8") let sum+=212;;
	"9") let sum+=243;;
	"10") let sum+=273;;
	"11") let sum+=304;;
	"12") let sum+=334;;
esac
let sum+=$date
let sum%=7
case $sum in
	"0")echo "2021년 $month월 $date일은 일요일입니다.";;
	"1")echo "2021년 $month월 $date일은 월요일입니다.";;
	"2")echo "2021년 $month월 $date일은 화요일입니다.";;
	"3")echo "2021년 $month월 $date일은 수요일입니다.";;
	"4")echo "2021년 $month월 $date일은 목요일입니다.";;
	"5")echo "2021년 $month월 $date일은 금요일입니다.";;
	"6")echo "2021년 $month월 $date일은 토요일입니다.";;
esac

우선 올해 연도 2021에서 1900을 뺀 값에 365를 곱한다. 하지만 우리는 2월달이 29일이 되는 윤년도 생각해야한다. 윤년은 4년마다 오기 때문에 1900년부터 구하고자하는 연도를 뺀 값을 4로 나눈 값을 더해준다. 그 다음 입력한 월의 전달까지의 지난 날짜를 더한다. 그리고 입력한 달의 날짜를 더하면 1900년 1월 1일부터 2021년 입력한 날짜까지의 총 일 수가 구해지게 된다. 이 값을 7로 나누어 나누어 떨어질 경우 일요일 나머지가 1씩 증가할 때마다 월~토까지 나오게 된다.

아래 그림은 실행 결과다.

오늘 날짜와 생일, 1월 1일을 실행해 보았다.

 

결과는 wsl2 ubuntu-20.04에서 실행하였다.

이 글에서는 짧은 bash shell script 프로그램을 작성하여 실행해보도록 하겠다.

이 프로그램은 두 정수를 입력받아 두 정수 사이에 속하는 모든 소수의 합을 구하는 프로그램이다. 코드는 다음과 같다.

#!/bin/bash
let rst=0
echo -n "type two integers : "
read x y
if [ $x == $y ] #만약 두 숫자가 같다면 x, y사이에 값이 없으므로 0을 출력하고 종료
then
    echo 0
    exit 1
fi
if [ $x -gt $y ] //x보다 y가 작다면 둘이 숫자를 swap
then
    let tmp=$x
    x=$y
    y=$tmp
fi
let x++
while (( $x != $y )) #x가 y보다 작을 때까지
do
    if [ $x -eq 2 ] #2인 경우 추가
    then
        let rst+=2
        let x++
        continue;
    fi
    tmp=2 #나누는 수 2부터 시작
    until (( $tmp == $x )) #나누는 수가 x보다 작을 동안만 반복
    do
        let rest=$x%$tmp #나머지 계산
        if [ $rest -eq 0 ] #나누어 떨어지는 경우
        then
            break;
        fi
        let tmp++ #나누어 떨어지지 않는 경우
    done
    if [ $tmp -eq $x ] #2부터 x-1까지 x와 나누어 떨어지는 수가 하나도 없는 경우
    then
        let rst+=$x #rst에 x 더함
    fi
    let x++ #x 1 증가
done
echo "result : $rst"

큰 숫자가 먼저 나오는 경우도 올바르게 출력된다.

이 코드는 다음과 같이 실행된다.

1. x와 y가 같은지 확인한다. 같을 경우 0출력하고 종료

2. y가 x보다 큰지 확인한다. 그럴 경우 두 변수를 바꾼다.

3. x를 1씩 증가하며 y보다 작을 때까지 계산을 반복한다.

  3-1. x가 2인경우 rst에 x를 더한다.

  3-2. x가 소수인지 판별할 tmp변수를 2부터 x-1까지 1씩 증가하며 x와 나누어 떨어지는지 확인한다.

  3-3. 만약 나누어 떨어지는 수가 있는 경우 rst에 아무것도 더하지 않고 x를 1 증가시킨다.

  3-4. 만약 2부터 x-1까지 모든 수가 x와 나누어 떨어지지 않는 경우 rst에 x를 더한다.

 

위 실행 결과는 wsl2 ubuntu-20.04버전에서 실행한 결과이다.

    어떤 터미널 창을 열었을 때 우리는 쉘을 보게 된다. 이 쉘은 명령어를 입력하여 컴퓨터와 대화하는 프로그램이다. 이 쉘은 프로그램이기 때문에 어떤 터미널 창을 띄울 경우 하나의 프로세스라는 말이다. 리눅스, 맥 OS X에서 기본으로 사용되는 쉘은 Bash 쉘이다 이 Bash 쉘은 유닉스에서 사용되던 본 쉘(Bourne shell)을 GNU에서 확장하여 개발하였다. 이 글에서는 bash 쉘에서 사용하는 문법을 이용해 짧은 쉘 스크립트 프로그램을 짜는 방법을 알아볼 것이다.

    우선 쉘에서는 환경변수와 지역변수가 존재한다. 환경변수는 자식 프로세스에게 상속되는 변수이고 지역변수는 상속되지 않는 변수이다. bash shell창에 $ env를 통해 미리 정해진 환경 변수들을 살펴볼 수 있다. bash shell에서 다음과 같이 변수를 설정할 수 있다.

$ VAR=STRING
$ export VAR

첫 번째 줄과 같이 [변수명]=[문자열]로 지역변수를 설정할 수 있고 두 번째 줄과 같이 export [변수명]을 통해 설정한 지역변수를 환경변수로 만들 수 있다. 이때 주의해야할 점은 '=' 앞뒤에 공백이 있으면 안된다는 것이다.

또 리스트 변수를 선언할 수 있다. 리스트 변수는 다음과 같이 선언할 수 있다.

$ HERO=(LEESOONSHIN KIMYOUSHIN AHNJUNGKEUN YOUKWANSOON)
${HERO[i]} #리스트의 i번째 원소
${HERO[*]} #리스트의 모든 원소
${HERO[@]} #동일
${#HERO[*]} #리스트의 원소 개수
${#HERO[@]} #동일

첫 번째 줄과 같이 괄호( ) 안에 공백으로 원소를 구분하며 나열하여 선언할 수 있다. 그 아래와 같이 C언어와 비슷하게 대괄호 안에 원하는 인덱스의 번호를 주어 해당 원소에 접근할 수 있다. 만약 모든 원소를 사용하고 싶은 경우 인덱스 번호 대신 '*'나 '@'를 주면 된다. 마지막으로 원소의 개수는 모든 원소를 접근하는 방법에다가 리스트 변수명 앞에 '#'을 붙여 나타낼 수 있다. 실제 실행결과는 다음과 같다.

실제 실행 결과

echo라는 명령어는 뒤에 나오는 인자를 화면에 출력해주는 명령어이다. 따라서 변수를 줬을 때 변수의 값을 출력해준다. 변수를 접근하고자할 때는 변수명 앞에 '$'를 붙여줘야한다. 그렇지 않으면 문자열로 인식하여 다음과 같이 출력될 수 있다.

변수명 앞에 '$'를 붙이지 않을 경우

위 사진은 wsl2 Ubuntu-20.04에서 실행한 결과다. 다음 시간에는 이런 변수를 통해 짧은 shell script program을 짜보겠다.

+ Recent posts