요일 확인

 

안녕하세요, MJ 입니다.
 
날짜를 입력하여 요일을 확인하는 스크립트 입니다.
이전에 bash, batch, powershell 용 스크립트를 함께 포스팅 했었는데
bash 스크립트 목록을 작성한 기념으로 사용방법을 추가하여 다시 올려봅니다.

(사용방법)

1. bash 에서 파일을 만들고, 스크립트 내용을 붙여넣습니다.

[root]# vi  /usr/local/bin/whatday
(소문자 i 를 한번 누른다)
아래 스크립트 내용을 "붙여넣기" 한다.
"ESC" 를 한번 누른다.
":wq" 를 입력하고 엔터를 치면, 파일이 저장되고 프롬프트로 나가진다.

2. 만든 파일에 CR 이 있지 않은지 확인한다.

[root]# file /usr/local/bin/whatday
>엔터를 쳤을 때, CR 이라는 문자가 포함된 로그가 확인된다면, 캐리지리턴 문자가 포함되어있는것으로 리눅스에서 스크립트를 정상실행시킬 수 없으므로 다음을 수행합니다.
[root]# dos2unix /usr/local/bin/whatday
> 이렇게 해서 캐리지리턴을 제거합니다.
dos2unix 명령어가 없는 경우 yum install dos2unix 를 수행하여 설치합니다.

3. 생성 한 파일에 실행 권한을 설정한다.

[root]# chmod 755 /usr/local/bin/whatday

4. 이제부터 whatday 명령어를 사용 할 수 있게 되었다.

"실행"
[root]# whayday 2024-09-15
Sun
 
문의사항은 댓글을 달아 주시면 성심껏 답변 드리겠습니다.

감사합니다.
  

[bash - 요일 확인]

#!/bin/bash
 
if [ ${#} -ne 1 ] && [ ${#} -ne 0 ];then
    echo "Usage: ${0} yyyy-mm-dd"
    exit 1
fi

if [ ${#} -eq 1 ];then
    INPUT=${1}
elif [ ${#} -eq 0 ];then
    echo -n "please input date (format: yyyy-mm-dd): "
    read INPUT
fi

wrong_bit=0
tmp_y=$(expr substr $INPUT 1 4)
tmp_m=$(expr substr $INPUT 6 2)
tmp_d=$(expr substr $INPUT 9 2)
seq $tmp_y $tmp_y &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 4)
fi
seq $tmp_m $tmp_m &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 2)
fi
seq $tmp_d $tmp_d &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 1)
fi
if [ ${wrong_bit} -ne 0 ];then
    if   [ ${wrong_bit} -eq 7 ];then
        echo 'Wrong Your Input Number of Year, Month, Day.'
    elif [ ${wrong_bit} -eq 6 ];then
        echo 'Wrong Your Input Number of Year, Month.'
    elif [ ${wrong_bit} -eq 5 ];then
        echo 'Wrong Your Input Number of Year, Day.'
    elif [ ${wrong_bit} -eq 4 ];then
        echo 'Wrong Your Input Number of Year.'
    elif [ ${wrong_bit} -eq 3 ];then
        echo 'Wrong Your Input Number of Month, Day.'
    elif [ ${wrong_bit} -eq 2 ];then
        echo 'Wrong Your Input Number of Month.'
    elif [ ${wrong_bit} -eq 1 ];then
        echo 'Wrong Your Input Number of Day.'
    fi
    exit 1
fi

 
getDay()
{
yy=$(expr substr $1 1 4)
mm=$(expr substr $1 6 2)
dd=$(expr substr $1 9 2)
if [ $mm = "01" ] || [ $mm = "02" ]; then
yy=$(expr $yy - 1)
mm=$(expr $mm + 12)
fi
yC=$(expr $yy / 100)
yY=$(expr $yy % 100)
 
# 제라의 요일 공식
num=$(echo $1 | awk '{ printf("%d", ((21*'$yC'/4)+(5*'$yY'/4)+(26*('$mm'+1)/10)+'$dd'-1) % 7); }')
 
case $num in
0) echo 'Sun' ;;
1) echo 'Mon' ;;
2) echo 'Tue' ;;
3) echo 'Wed' ;;
4) echo 'Thu' ;;
5) echo 'Fri' ;;
6) echo 'Sat' ;;
esac
}
getDay ${INPUT}


1. 스크립트:준비(소개글)

안녕하세요, MJ 입니다.



스크립트에 대해 이야기 해 보려고 합니다.
스크립트(script)는 영어사전에서 대본 이라는 의미를 확인 할 수 있습니다.

수행 할 명령어를 순서대로 작성해서

반복하여 수행 할 필요가 있을 때, 스크립트를 작성해서 수행하도록 한다면,
오타도 없고, 누락되는 명령어도 없어, 정해진 업무 처리가 편할 것 입니다.

스크립트를 작성하기위해 준비를 해야 할 내용

1. 우선 목적이 있어야 하고,
2. 어떤 순서로 일을 처리하도록 해야 할 지의 세부적인 계획이 필요합니다.
3. 필요한 문법을 검색하여
4. 계획별로 구현하기위한 노력이 필요합니다.

예1) 우리 일상생활에서의 일 중 하나를 예로 들어본다면,

1. 목적: 출근
2. 계획: 대중교통을 이용하여 목적지까지 이동
3. 문법: 대중교통을 이용하는 방법을 확인, 어디에서 어떻게 타야 환승이 편리한지 확인
4. 노력: 출근을 하기위해 확인된 대중교통 이용방법으로 대중교통을 이용하여 목적지로 이동

예2) 파일을 정해진 시간에 정해진 원격지로 전송

1. 목적: 특정시간에 파일을 원격지로 전송
2. 계획: 특정시간이 되었는지 확인하고, FTP 를 이용하여 파일을 전송
3. 문법: 시간을 체크하는 방법과 FTP 이용방법을 확인
4. 노력: 확인된 방법을 이용하여 시간을 체크하고, 확인된 FTP이용방법으로 파일을 전송

> 엔터 한번으로 시간을 확인하고, 원격지로 파일이 전송 될 것 입니다.
추가로 cronjob 을 등록하여 스크립트를 수행하도록 한다면, 자동화가 되겠지요.


너무나도 당연한 예 이고, 각 단계의 작은 제목이 좀 어색하고 이상해보일 수 있습니다만,
저의 설명에서의 팩트는 각 단계를 적절히 분할하여 생각하는 것 입니다.

단계의 분할은, 스크립트를 개발하는 사람이, 목적에 맞게 적절히 이루어져야 합니다.
복잡도에 따라 더 많은 단계로 분할 될 수도 있고, 그렇지 않을 수도 있습니다.

그리고 시간이 한참 흐른 뒤에도 내용을 수정하거나, 이해할 수 있도록 작성되어야 합니다.

다음 포스팅에서는 임의의 목적을 설정하고 필요한 문법에 대해 다루어보도록 하겠습니다.

감사합니다.

MJ.제라의 요일 공식 스크립트(bash, batch, powershell)

안녕하세요, MJ 입니다.

년-월-일 의 정보로 요일을 확인할 수 있는 방법 입니다.

1582년10월 15일부터는 그레고리 력으로 우리가 사용하는 서기에 적용되는 윤년/평년 확인방법입니다.

다음 3가지를 확인하여 윤년과, 평년을 미리 알 수 있습니다.
  1. 년수 4로 나누었을 때 나머지가 없는 해를 윤년으로 함.
  2. 위의 윤년중에서 100으로 나누었을 때 나머지가 없을때는 평년으로 함.
  3. 다시 400으로 나누었을 때 나머지가 없는 해는 윤년으로 함

3가지 조건 이지만 의외로 복잡합니다.

 

아뭏든 날짜를 넣으면 요일이 출력이 된다는 것입니다.

아래 스크립트는 단순히 입력 받은 날짜가 무슨 요일인지 영어로 토해내도록 작성되었습니다.


다른 스크립트 또는 프로그램에서 특정일자의 요일을 확인해야 하는 로직이 존재하는 경우,

OS 스크립트를 수행하여 결과를 받도록 하면, 추가로 작성해야 하는 코드의 양을 줄일 수 있어 활용하기에 따라 경제적으로 이득을 취할 수 있습니다.

 * 활용 예시 *

로또 API 를 이용해서 모든 회차의 당첨번호를 가져올 수 있지만, API 요청으로 얻어지는 정보는 무제한으로 제공되지 않고 대부분 하루동안 N회 가져올 수 있습니다. 그래서 최초에 한번 가져온 데이터를 별도 파일이나 DB에 저장을 하고, 당첨번호 목록을 조회 할 때에 내가 저장해둔 파일 또는 DB에서 검색해서 확인하게 됩니다. (무제한 접근가능하다고 하여도 속도가 훨씬 빠릅니다.) 하지만 조회를 시도하는 시점에서 오늘이 토요일이라면, 그리고 당첨번호 발표 시간이 지났고 동행복권 사이트에 당첨번호 정보가 등록이 되었다면 이 새로운 회차의 당첨번호는 API요청을 해서 가져와야 나의 저장된 데이터가 업데이트 될 수 있을 것 입니다. 저는 이 요일을 확인하도록 해서 이 스크립트를 수행하여 오늘이 토요일이 아닌지 매번 확인을 하도록 하고, 발표시간이 지났다면 API 한번 찔러보는 방법으로 하루동안 아무리 많이 찔러도 10번도 안찌르는것 같습니다.저는 파이썬에서 OS의 명령어를 수행하고 결과를 받아오도록 작성하였고, 이 외에도 요일의 체크가 필요한 경우에 여러 프로그램이나 스크립트에서 수행하도록 할 수 있기때문에 은근히 활용도가 높다고 볼 수 있겠습니다.


 배치와 파워쉘 환경은 제가 익숙하지 않아, 예외처리 내용이 좀 부족합니다.
실행 방법을 잘 확인 해 주세요.

스크립트는 다음 3가지 버전으로 작성되었습니다.

  • Bash 스크립트(Linux)
  • 배치 스크립트 (windows)
  • 파워쉘 스크립트(windows)

    사용하시는 OS에서 지원하는 스크립트를 작성하여 사용할 수 있습니다.

bash 스크립트

#!/bin/bash
 
if [ ${#} -ne 1 ] && [ ${#} -ne 0 ];then
    echo "Usage: ${0} yyyy-mm-dd"
    exit 1
fi

if [ ${#} -eq 1 ];then
    INPUT=${1}
elif [ ${#} -eq 0 ];then
    echo -n "please input date (format: yyyy-mm-dd): "
    read INPUT
fi

wrong_bit=0
tmp_y=$(expr substr $INPUT 1 4)
tmp_m=$(expr substr $INPUT 6 2)
tmp_d=$(expr substr $INPUT 9 2)
seq $tmp_y $tmp_y &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 4)
fi
seq $tmp_m $tmp_m &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 2)
fi
seq $tmp_d $tmp_d &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 1)
fi
if [ ${wrong_bit} -ne 0 ];then
    if   [ ${wrong_bit} -eq 7 ];then
        echo 'Wrong Your Input Number of Year, Month, Day.'
    elif [ ${wrong_bit} -eq 6 ];then
        echo 'Wrong Your Input Number of Year, Month.'
    elif [ ${wrong_bit} -eq 5 ];then
        echo 'Wrong Your Input Number of Year, Day.'
    elif [ ${wrong_bit} -eq 4 ];then
        echo 'Wrong Your Input Number of Year.'
    elif [ ${wrong_bit} -eq 3 ];then
        echo 'Wrong Your Input Number of Month, Day.'
    elif [ ${wrong_bit} -eq 2 ];then
        echo 'Wrong Your Input Number of Month.'
    elif [ ${wrong_bit} -eq 1 ];then
        echo 'Wrong Your Input Number of Day.'
    fi
    exit 1
fi

 
getDay()
{
yy=$(expr substr $1 1 4)
mm=$(expr substr $1 6 2)
dd=$(expr substr $1 9 2)
if [ $mm = "01" ] || [ $mm = "02" ]; then
yy=$(expr $yy - 1)
mm=$(expr $mm + 12)
fi
yC=$(expr $yy / 100)
yY=$(expr $yy % 100)
 
# 제라의 요일 공식
num=$(echo $1 | awk '{ printf("%d", ((21*'$yC'/4)+(5*'$yY'/4)+(26*('$mm'+1)/10)+'$dd'-1) % 7); }')
 
case $num in
0) echo 'Sun' ;;
1) echo 'Mon' ;;
2) echo 'Tue' ;;
3) echo 'Wed' ;;
4) echo 'Thu' ;;
5) echo 'Fri' ;;
6) echo 'Sat' ;;
esac
}
getDay ${INPUT}

배치 스크립트

@echo off
:: 인수로 연도(4자리)-월(2자리)-일(2자리) 를 입력합니다.
:: 인수가 없으면 입력을 받습니다.
 
set /a _argc=0
 
for %%i in (%*) do (set /A _argc+=1)
rem echo %_argc%
 
if %_argc% EQU 0 (
    set /p var="please input date (format: yyyy-mm-dd):"
)else if %_argc% EQU 1 (
    set var=%1%
) else (
    echo "Usage: %0 yyyy-mm-dd"
    goto end
)
set /a "yyyy=%var:~0,4% %% 99999999" 2> nul
 
if        %var:~5,2% EQU 01 (set /a mm=1
)else if  %var:~5,2% EQU 02 (set /a mm=2
)else if  %var:~5,2% EQU 03 (set /a mm=3
)else if  %var:~5,2% EQU 04 (set /a mm=4
)else if  %var:~5,2% EQU 05 (set /a mm=5
)else if  %var:~5,2% EQU 06 (set /a mm=6
)else if  %var:~5,2% EQU 07 (set /a mm=7
)else if  %var:~5,2% EQU 08 (set /a mm=8
)else if  %var:~5,2% EQU 09 (set /a mm=9
)else (set /a mm=%var:~5,2%)
 
if       %var:~8,2% EQU 01 (set /a dd=1
)else if %var:~8,2% EQU 02 (set /a dd=2
)else if %var:~8,2% EQU 03 (set /a dd=3
)else if %var:~8,2% EQU 04 (set /a dd=4
)else if %var:~8,2% EQU 05 (set /a dd=5
)else if %var:~8,2% EQU 06 (set /a dd=6
)else if %var:~8,2% EQU 07 (set /a dd=7
)else if %var:~8,2% EQU 08 (set /a dd=8
)else if %var:~8,2% EQU 09 (set /a dd=9
)else (set /a dd=%var:~8,2%)
 
if %mm% EQU 1 (set /a mm=%mm%+12 2>nul
    set /a yyyy=%yyyy%-1 2>nul
)
if %mm% EQU 2 (set /a mm=%mm%+12 2>nul
    set /a yyyy=%yyyy%-1 2>nul
)
 
set /a a=%yyyy:~0,2%
if       %yyyy:~2,2% EQU 01 (set /a b=1
)else if %yyyy:~2,2% EQU 02 (set /a b=2
)else if %yyyy:~2,2% EQU 03 (set /a b=3
)else if %yyyy:~2,2% EQU 04 (set /a b=4
)else if %yyyy:~2,2% EQU 05 (set /a b=5
)else if %yyyy:~2,2% EQU 06 (set /a b=6
)else if %yyyy:~2,2% EQU 07 (set /a b=7
)else if %yyyy:~2,2% EQU 08 (set /a b=8
)else if %yyyy:~2,2% EQU 09 (set /a b=9
)else (set /a b=%yyyy:~2,2%)
set /a c=%mm%
set /a d=%dd%
 
::echo %a%
::echo %b%
::echo %c%
::echo %d%
 
set /a dname=((21*%a%/4)+(5*%b%/4)+(26*(%c%+1)/10)+%d%-1)%%7
if %dname% EQU 0 (echo 'Sun')
if %dname% EQU 1 (echo 'Mon')
if %dname% EQU 2 (echo 'Tue')
if %dname% EQU 3 (echo 'Wed')
if %dname% EQU 4 (echo 'Thu')
if %dname% EQU 5 (echo 'Fri')
if %dname% EQU 6 (echo 'Sat')
 
:: pause
 
:end

파워쉘 스크립트

if ( $args.Count -ne 1 ) {
    echo -n "Usage: .\$($MyInvocation.MyCommand.Name) yyyy-mm-dd"
    exit 1
}
 
$input_date=$args[0]
 
$yyyy=$input_date.split('-')[0]
$mm=$input_date.split('-')[1]
$dd=$input_date.split('-')[2]
 
$mod=$false
if( [int]$mm -eq 1 ) {
    $mod = $true
} elseif( [int]$mm -eq 2 ) {
    $mod = $true
}
 
if ( $mod -eq $true ) {
    $mm = [int]$mm + 12
    $yyyy = [int]$yyyy - 1
}
 
 
$a = [int]($yyyy / 100)
$b = [int]($yyyy % 100)
$c = [int]$mm
$d = [int]$dd
 
$dname=[int]((21*$a/4)+(5*$b/4)+(26*($c+1)/10)+$d-1)%7
 
switch($dname) {
    0 { $toDay = 'Sun' }
    1 { $toDay = 'Mon' }
    2 { $toDay = 'Tue' }
    3 { $toDay = 'Wed' }
    4 { $toDay = 'Thu' }
    5 { $toDay = 'Fri' }
    6 { $toDay = 'Sat' }
}
 
echo $toDay
 
 
 

내 리눅스 서버, 대체 뭐가 문제야?

내 리눅스 서버, 대체 뭐가 문제야? 안녕하세요. 오늘은 리눅스 서버가 버벅거릴 때, 원인을 파악하는 방법에 대해 알아보려고 해요. 서버의 성능 저하 원인을 찾는 것은 시스템 관리에서 매우 중요한 부분이에요. CPU, 메모리 사용량부터 수상한 프로...

가장 많이 본 글