안녕하세요 대추입니다.
오늘은 서버 작업을 하며 예상외로 사용하는 경우가 많은
쉘 스크립트 작성법에 대해 기록하겠습니다.
간단한 정의부터 알고 넘어갈까요?
쉘 "스크립트" 에서 스크립트의 정의만 알더라도
자바스크립트, 펄 스크립트, 쉘 스크립트 등등 모두 아실 수 있습니다.
스크립트는 텍스트 형식으로 작성되며 한줄 씩 순차적으로 실행되도록 만든 프로그램을 말합니다.
여기에 앞에 붙은 자바, 펄, 쉘 은 실행되는 환경을 의미한다고 생각하시면 됩니다.
브라우저에서 실행되야 하니 "자바 스크립트"
펄 엔진이 실행해야 하니 "펄 스크립트"
운영체제 쉘(운영체제의 기능과 서비스를 제공하는 프로그램)이 실행해야 하니 "쉘 스크립트"
입니다.
이해되셨죠?
바로 본론으로 가겠습니다.
1. 쉘 스크립트 문법
• 변수 만들기 및 변수 사용하기
# 변수명=값 ('='의 앞 뒤에 공백이 존재하면 안됩니다)
A=1000
B=2000
C=3000
D=4000
# 변수를 사용하려면 '$'를 앞에 붙이거나 ${변수명}과 같이 중괄호로 감싸야합니다.
echo $A $B $C $D
echo ${A} ${B} ${C} ${D}
# output: 1000 2000 3000 4000
# 1000 2000 3000 4000
가장 기초인 변수 만들기 입니다.
"변수명=값"으로 이루어지며 '='의 앞 뒤에는 절대 공백이 존재해서는 안됩니다!
그리고 만든 변수를 사용하기 위해서는 앞에 '$' 표시를 붙이거나 ${변수명}와 같이 중괄호로 감싸야합니다.
또는 자바스크립트같이 ` (백틱)으로 감싼뒤 변수를 사용할 수 있습니다.
여러번 시행착오를 거치시면 언제 어떤 형태로 사용하는게 좋을 지 본인만의 규칙이 생기니 연습! 하시길 바랍니다.
위의 예시를 보면서 이해하시면 될 것 같습니다
.
• 변수 사용의 응용법
# 사칙연산 예시
A=2000
B=1000
# 연산을 하여면 변수를 괄호로 묶어야 합니다.
echo $(($A + $B)) $(($A - $B)) $(($A / $B)) $(($A * $B))
# output: 3000 1000 2 2000000
위의 예시와 같이 '(', ')' 소괄호로 감싸고 연산하시면 됩니다.
예시로 사칙 연산만 한 것이며 위와 같이 이중 소괄호로 여러가지로 응용이 가능합니다.
사실 '()', '{}', '[]' 모두 의미가 있는데 기본기 글에 맞지않게 너무 복잡해지니
위의 예시를 바탕으로 여러 시행착오를 거치며 감을 잡으시길 바랍니다.
쉘 스크립트를 써봐야겠다 생각하신분이라면 누구나 금방 응용하실 겁니다.
2. 쉘 스크립트 자주 사용하는 형태 (날짜, curl, Log, 데이터 백업)
• 날짜의 연산
# 기본 format : data +형식
# 형식의 경우 몇개만 소개하자면 (년: %Y, 월: %m, 일: %d) 입니다.
currDate=$(date '+%Y-%m-%d')
echo $currDate
# output: 2022-07-05
# (22.07.05 기준)
# 날짜 연산 예제
# 과거, 미래
currDateOneBefore=$(date '+%Y-%m-%d' -d '1 days ago')
currDateOneAfter=$(date '+%Y-%m-%d' -d '1 days')
echo 'yesterday:' $currDateOneBefore
echo 'tomorrow:' $currDateOneAfter
# output: yesterday: 2022-07-04
# tomorrow: 2022-07-06
# (22.07.05 기준)
날짜의 연산도 쉘스크립트에서 자주 사용하는 편입니다.
curl과 연계하여 데이터 조회에 쓰거나, Log를 시간에 관련하여 남길때 쓰거나, 파일의 백업할때 쓴다거나
여러모로 쓰입니다.
기본 형태는 'data +형식' 이며 예제를 살펴보시면 아실 수 있습니다
위의 기본 사용법을 이해하시면 어떤 형태로든 응용이 가능합니다.
날짜 연산의 경우 days를 week, month, minute, second 등으로 바꿔 더 크거나 작은 단위로 연산이 가능하나
워낙 많아 모든 경우를 소개시켜드리진 않고 사용처에 따라 더 검색하시길 바랍니다...
• curl을 활용한 HTTP 요청
# curl을 활용한 http 요청 예제
echo `curl https://www.google.com/`
# output :
# % Total % Received % Xferd Average Speed Time Time Time Current
# Dload Upload Total Spent Left Speed
# 100 15073 0 15073 0 0 58818 0 --:--:-- --:--:-- --:--:-- 59109
curl 라이브러리를 사용해 서버에 요청을 해서 authorization 헤더나 토큰 등을 받아 사용하는 경우도 많이 있습니다.
위의 output과 같은 모습으로 결과가 나오며 (더 많이 나오지만 생략...)
구글에 요청하는 것처럼 GET, POST, PUT, PATCH 등 모두 응용하여 사용할 수 있습니다.
curl이 뭔지 모르겠고 사용하는 법도 모르겠다면, 조만간 curl 사용법에 대해서도 포스팅하도록 하겠습니다.
• Log 남기기
# echo를 활용한 로그 예제
currDate=$(date +"%Y-%m-%d %T")
echo "[$currDate] log stored." >> test.log
# output: [2022-07-05 13:32:36] log stored.
# [2022-07-05 13:32:37] log stored.
# [2022-07-05 13:32:37] log stored.
# [2022-07-05 13:32:38] log stored.
# [2022-07-05 13:32:38] log stored.
# 5번 실행 기준
로그를 남기는 방법도 다양하게 있지만 가장 간단하게 echo를 활용하여 남기는 방법만 소개해드리겠습니다
사용처에 따라 더 고민해서 응용해보시면 될 것 같습니다.
위의 예제의 핵심은 '>>' 이며 앞의 echo에서 나온 출력물을 '>>' 뒤의 이름을 가진 파일에 저장하는 원리입니다.
코드를 해석하자면 현재 시간을 배치 파일 실행 시 마다 test.log 라는 파일에 쌓는다는 의미입니다.
보통 서버 에러 로그와 같은 곳에 사용하며 개발을 하시다보면 로그의 중요성이 얼마나 큰지 아실겁니다.
만드시는 프로젝트에 잘 적용하셔서 좋은 완성품 만드시길 바랍니다.
• DB 백업(dump) 파일 생성 (mysql 기준)
# mysql dump sql 생성 예제
userName='root'
userPwd=1234
userDB='test'
currDate=$(date '+%Y-%m-%d %T')
mysqldump -u [계정명] -p[비밀번호] --databases [DB명] > DB명_$currDate.sql
# 계정이 root, 비밀번호가 1234, DB명이 test라고 가정하겠습니다.
# output: 2022-07-05-140113.sql (파일이 생성되고 내용을 보면 DB dump 파일 내용입니다)
MySQL에서 덤프 파일을 뽑아내는 예제입니다.
보통 작은 규모의 DB 레플리케이션같은 세팅을 하기 부담스러우니
간단하게 스크립트를 구성해 정해진 몇 시에 해당 쉘 스크립트를 실행하게 만들어 db를 백업합니다.
해당 예제는 실행하기전 컴퓨터에 mysql이 설치가 되어있어야합니다.
그리고 mysql 의 많고 많은 dump 예제 중 하나일뿐 다른 방식이나, 다른 db에서는 다른 방식으로 구성하셔야 하니
사용처에 따라 알맞는 추가 검색을 필요로 합니다.
위와 같이 쉘 스크립트를 활용한 응용은 무궁무진하여 글 한 두개로 알려드리기에는 무리가 있습니다.
하지만 잘만 사용한다면 반복적인 일, 규칙이 있는 일 등에 적용하여 배치 파일을 구성하고 스케줄링을 하여
서비스의 효율이나 일의 능률을 비약적으로 상승시킬 수 있습니다.
개발의 어떤 파트에서 일을 하던간에 개발로 밥 벌어먹는 다면 알아두면 전혀 손해가 아닌 쉘 스크립트였습니다.
도움이 되었으면 좋겠습니다 :)
'공부하는 중~~ > 분류하기 애매한 것들' 카테고리의 다른 글
[Github] 깃허브(github) config 설정 변경, 계정 변경 (0) | 2022.07.29 |
---|---|
[Kubernetes] 쿠버네티스 기억해야할 포트 (0) | 2022.07.11 |
[Linux] Crontab을 사용한 스케줄링 수행 (0) | 2022.07.05 |
[Ubuntu 20.04] 우분투 설정이 안열려요! 해결법 (2) | 2021.06.04 |
[Ubuntu 20.04] ssh를 사용하여 원격 디스크 연결(마운트) (0) | 2021.04.28 |
댓글