Skip to content
On this page

쉘 스크립트 작성하기

수정하기
문서 생성 2022-12-06 21:34:33 최근 수정 2022-12-06 23:04:27
week number를 출력하는 프로그램 만들기

Goal

스크립트를 작성하고 실행하는 방법을 알아본다.

주간 회고를 기록할 때 week number를 표기한다. 그런데 이번주 번호가 뭔지 기억이 나지 않는다. 작성시마다 매번 지난 주 회고를 확인했기 때문에 번거로움을 느꼈다. 그래서 찾아보니 date라는 명령어가 있었다.

다음 코드를 입력하면 week number가 출력된다.:

date +"%U"

그런데 나는 특정 날짜를 입력할 때도 week number를 구하고 싶었다. -d 옵션을 추가하고 날짜를 입력하면 된다는데 -d 옵션이 없다는 오류만 나타났다.

date -d "2022-12-06" +"%U"

man date로 명령을 확인해보니, -d 옵션은 없었다.

검색 을 해보니, mac osx와 linux의 date 명령이 다르다고 한다. mac은 unix 계열이기 때문이라고. 그래서 coreutils 를 설치해서 사용하라고 했다. 명령어를 묶어 놓은 패키지라고 한다.

brew install coreutils

설치 후에 gdate라는 명령어를 실행하니 값이 잘 나왔다.

gdate -d "2022-12-06" +"%U"

좋다. 하지만 week number를 구하고 싶을 때 매번 이 명령어를 입력하기 귀찮으니, 쉘 스크립트를 작성해서 week라는 프로그램을 만들어보자.

쉘 스크립트?

  • 쉘 스크립트는 명령어들이 나열되어 있는 파일1
  • 쉘 스크립트에 내가 필요한 명령어를 나열하고 해당 스크립트를 실행하면 되겠다.

쉘 스크립트 작성하기

week라는 파일을 생성하자. 여기에 쉘 스크립트를 작성할 것이다.

touch week

다음 스크립트를 입력한다:

#!/bin/bash
# show week number program
gdate +"%Y-W%V" # ex) 2022-W49
  • #: 주석
  • #!/bin/bash: 저번에 알게된 shebang 이다. 뒤에 작성하는 스크립트를 실행하기 위한 인터프리터의 이름을 시스템에게 알려준다.

이제 파일을 저장한다.

쉘 스크립트 실행하기

만들어진 week 프로그램을 실행하자.

$ week
command not found: week

이상하다. 명령어를 찾을 수 없다고 한다. 스크립트를 실행하기 위해 정확한 경로를 입력해야 하기 때문에 ./week라고 실행해야 한다. (현재 디렉터리에 스크립트가 존재한다.)

$ ./week
permission denied: ./week

이번엔 permission denied: week라는 오류가 나타난다. 실행 권한을 설정하지 않았기 때문이다. chmod 명령어를 사용해 설정하면 된다.

755는 모든 사용자에게 실행 권한을 주고, 700은 파일 소유자만 실행 가능하다.

chmod 755 week

다시 실행해보자.

$ ./week
2022-W49

잘 나오는 것을 확인할 수 있다. 음.. 그런데 앞에 ./를 매번 입력하는 것은 번거롭고 또 멋이 없다. 다른 명령처럼 없애고 싶다. 어떻게 해야할까?

시스템은 실행 프로그램을 찾을 때마다 디렉토리 목록을 검색한다. 예를 들어 ls 명령은 /bin/ls에 위치하고 있다. /bin 디렉토리는 시스템이 자동으로 검색하는 디렉토리 중 하나인데, 이 디렉터리 목록은 PATH라고 하는 환경 변수에 설정되어 있다.

다음 명령을 실행하면 디렉토리 목록이 조회된다:

$ echo $PATH

~/bin 디렉토리는 개인적인 용도로 사용하려는 스크립트를 저장하기에 적합한 장소라고 한다.2 그래서 $PATH라는 환경 변수에 해당 디렉토리를 추가해주자.

# .bashrc
export PATH=~/bin:"$PATH"

그리고 쉘이 이 설정을 바로 적용하도록 source 명령을 사용하자.

$ source ./bashrc

앞서 만든 프로그램은 ~/bin 디렉토리 내부로 이동시키자.

$ mkdir bin
$ mv week bin
$ week
2022-W49

이제 경로를 입력하지 않아도 환경 변수에 설정된 디렉토리에서 프로그램을 찾아 실행할 수 있다.

매개변수

만들어 놓고 보니, 특정 날짜의 week number를 조회하는 것이 필요할 수도 있겠다는 생각이 들었다. 그렇다면 프로그램에 매개변수를 전달하면 될 것 같은데 쉘 스크립트에선 어떻게 사용할까?

$에 숫자를 붙여서 매개변수를 사용할 수 있다.

#! /bin/bash
echo $0 # 스크립트 파일 실행 명령어
echo $1 # 첫 번째 인자
echo $2 # 두 번째 인자
# ....

그리고 스크립트에 if 문도 사용할 수 있으므로 매개변수가 전달된 경우와 아닌 경우 분기 처리가 가능할 것 같다.

그럼 스크립트를 다음과 같이 수정하자:

#!/bin/bash
# show week number program
DATE=$1
if [[ $1 ]]; then
gdate -d $1 +"%Y-W%V" | xclip
else
gdate +"%Y-W%V" | xclip
fi

첫 번째 매개변수가 전달된 경우에는 -d 옵션을 사용하고, 그 외에는 현재 날짜의 week number를 보여주도록 한다.

결과 복사하기

여기까지 스크립트를 작성하니, week number를 보는 것 뿐만 아니라 바로 클립보드에 복사가 되었으면 좋겠다.

mac에서 명령어의 결과를 복사하려면 pbcopy 명령어를 사용하면 된다.

#!/bin/bash
# show week number program
DATE=$1
if [[ $DATE ]]; then
WEEK_NUMBER=$(gdate -d $DATE +"%Y-W%V")
else
WEEK_NUMBER=$(gdate +"%Y-W%V")
fi
echo $WEEK_NUMBER
echo $WEEK_NUMBER | pbcopy

생각

  • 《리눅스 커맨드라인 완벽 입문서》가 아주 큰 도움이 되었다.
    • 내 기억으론 이 책은 약 7~8년 전에 구매한 듯 싶은데, 아주 오랜만에 펼쳤다. 다음에도 많은 도움이 될 것이다.

  1. 이종우, 정영신 역, 윌리엄 E. 샤츠 주니어 저, 《리눅스 커맨드라인 완벽 입문서》, 2012년, 351쪽
  2. 이종우, 정영신 역, 윌리엄 E. 샤츠 주니어 저, 《리눅스 커맨드라인 완벽 입문서》, 2012년, 354쪽

LINKS TO THIS PAGE