TIL Shell Script
TIL Shell Script
TIL Shell Script
TIL 포스트를 자동으로 생성하고 업로드 하기 위해 다음과 같은 세 개의 shell script를 작성. 각각에 대한 설명.
- new.sh
- next.sh
- upload.sh
new.sh
- 이 스크립트는 주제를 첫 번째 인자로, 날짜를 두 번째 인자로 받아 해당 날짜와 주제에 맞는 빈 markdown 양식을 pending 폴더에 생성.
- 날짜에 인자가 주어지지 않는다면 0000-00-00을 날짜로 지정.
- 결과적으로 YYYY-MM-DD;TITLE.md 형태의 이름을 가짐.
- 주제에 공백을 입력하고 싶은 경우, 공백 자리에
_
를 입력하면 됨.
1. 모든 리눅스 환경에서 사용 가능하도록 기본 bash 사용.
#!/bin/bash
2. 주제 이름을 필수로 입력 받기 위해 if 문과 -z 옵션을 활용해 첫 번째 인자를 입력하지 않은 경우 종료.
if [ -z "$1" ]
then
echo "File is not made. Please enter a title"
exit 1
fi
3. 사용자가 입력한 `_`를 tr 명령어를 통해 공백으로 치환.
TITLE=$(echo $1 | tr '_' ' ')
echo $TITLE
4. 두 번째 인자를 입력하지 않은 경우 날짜를 0000-00-00 으로 설정.
if [ -z "$2" ]
then
DATE="0000-00-00"
else
DATE=$2
fi
5. 날짜와 주제에 맞는 markdown 양식을 생성하고, 경로와 파일 이름을 지정.
CONTENTS="# $TITLE\n\n## $TITLE 란/이란\n\n## References\n\n1. "
PATH=./pending
FILENAME=$DATE\;$TITLE.md
6. echo 명령어와 > 를 통해 새로운 파일을 만들고 내용을 씀. 이 때 echo에 -e 옵션을 줘 newline character를 제대로 escape 시킴.
echo -e $CONTENTS > "$PATH/$FILENAME"
next.sh
- 이 스크립트는 pending에 존재하는 가장 최신 TIL 포스트의 다음 날의 빈 markdown 양식을 생성.
- new.sh를 통해 생성하며, pending에 TIL 포스트가 하나도 없을 때는 현재 날짜 기준 다음 날으로 설정.
#!/bin/bash
1. new.sh와 동일하게 주제 이름은 필수로 입력 받음.
if [ -z "$1" ]
then
echo "File is not made. Please enter a title"
exit 1
fi
2. ls 와 grep을 통해 pending 폴더의 파일을 모두 가져오며, tail -n 1을 통해 가장 최신 TIL 포스트의 이름을 가져 옴.
FILENAME=$(ls ./pending | grep '\;' | tail -n 1)
3. 최신 TIL 포스트가 존재하는 경우에는 날짜를 parsing하고, 그렇지 않은 경우에는 현재 날짜를 최신 날짜로 설정.
if [ -z "$FILENAME" ]
then
LAST_DAY=$(date "+%Y-%m-%d")
else
LAST_DAY="${FILENAME:0:10}"
fi
4. date 명령어를 이용해 최신 날짜의 다음 날을 구하고, new.sh를 통해 새 markdown 양식 생성.
NEXT_DAY=$(date -d "$LAST_DAY next day" "+%Y-%m-%d")
./new.sh $1 $NEXT_DAY
upload.sh
- 이 스크립트는 pending에 작성된 오늘자 포스트를 자동으로 contents 폴더에 이동시켜주는 역할.
- 이동시키면서 이름을 양식에 맞게 바꿔 주고, README.md 최하단에 링크를 추가.
- 아직은 수동으로 검토가 필요하기 때문에 Github commit은 수행하지 않음.
#!/bin/bash
1. 오늘 날짜를 가져 옴.
TODAY="$(date "+%Y-%m-%d")"
2. 시작 경로와 도착 경로를 설정. 이 때 도착 경로인 contents 폴더는 월별로 분류되어있기 때문에, 오늘 날짜에서 달 부분까지 parsing 하는 과정 필요.
SOURCE_PATH=./pending
DEST_PATH=./contents/${TODAY:0:7}
3. ls 와 grep 명령어를 통해 오늘 날짜의 파일 이름을 가져 옴.
FILENAME=$(ls $SOURCE_PATH | grep "$TODAY")
4. 파일 이름이 없는 경우, 포스트가 작성되지 않았다고 알려 주고 종료.
if [ -z "$FILENAME" ]
then
echo "No file for upload today"
exit 1
5. 파일 이름에 newline이 있는 경우, 동일한 날짜의 포스트가 생성되었을 가능성이 높기 때문에 이를 알려 주고 종료.
elif [[ $FILENAME == *$'\n'* ]]
then
echo -e "FILENAME: $FILENAME\nPlease check the duplicate date or file name"
exit 2
fi
6. 파일의 주제에 해당하는 부분을 파일 이름에서 parsing 해 옴.
TITLE="${FILENAME:11:-3}"
7. if와 -d 옵션을 통해 도착 경로가 존재하지 않는다면, 경로를 만듦. (매 월 1일에 수행됨)
if [ ! -d $DEST_PATH ]
then
mkdir $DEST_PATH
fi
8. mv 명령어를 통해 파일을 이동시키고, 이름을 변경해 줌.
mv "$SOURCE_PATH/$FILENAME" "$DEST_PATH/$TODAY.md"
9. README 최하단에 링크 추가.
echo "- [$TITLE]($DEST_PATH/$TODAY.md)" >> ./README.md
차후 개선 사항
- README는 여러 섹션으로 나눠져 있고, 이 섹션에 링크를 넣는 방식으로 만들기 위해서는 README의 구조를 변경해야 함.
- 1번이 완성되고 자동화에 문제 없음이 확인 된 경우에는 commit 및 push까지 자동화 가능.
- 추후 이 repo 및 스크립트를 서버에 올려서 upload 스크립트가 자동으로 실행되게 설정 가능.