리눅스 쉘 스크립트 기초 (변수, 조건문, 반복문, 백업 스크립트 예제)
같은 명령어를 매일 손으로 입력하고 있다면 스크립트로 만들 때가 됐다. 쉘 스크립트는 터미널에서 치던 명령어를 파일에 순서대로 적어 두고 한 번에 실행하는 것이다. 이 글에서는 쉘 스크립트 기초 문법인 변수, 인자, 조건문, 반복문, 함수를 정리하고, 마지막에 실제로 쓸 수 있는 백업 스크립트를 만들어 본다. 만든 스크립트를 정해진 시간에 돌리는 방법은 리눅스 crontab 사용법에 있다.

첫 번째 쉘 스크립트 만들기
편집기로 hello.sh 파일을 만들고 아래처럼 적는다. vi가 익숙하지 않다면 vi 편집기 사용법을 먼저 보자.
#!/bin/bash
# 첫 번째 스크립트
echo "Hello, $(whoami)!"
echo "오늘은 $(date +%Y-%m-%d) 입니다."첫 줄의 #!/bin/bash는 셔뱅(shebang)이라고 부르며, 이 파일을 bash로 실행하라는 뜻이다. 저장한 뒤 실행 권한을 주고 실행한다.
chmod +x hello.sh
./hello.sh쉘 스크립트 기초 문법 1: 변수와 인자
#!/bin/bash
name="itinfo" # = 양옆에 공백이 있으면 안 된다
today=$(date +%Y%m%d) # 명령 결과를 변수에 저장
echo "이름: $name"
echo "날짜: ${today}"
# 실행할 때 넘긴 인자
echo "스크립트 이름: $0"
echo "첫 번째 인자: $1"
echo "인자 개수: $#"
echo "모든 인자: $@"- 변수를 쓸 때는 “$name”처럼 큰따옴표로 감싸는 습관을 들인다. 공백이 들어간 값에서 생기는 오류를 막는다.
- 작은따옴표 안에서는 변수가 풀리지 않는다. ‘$name’은 글자 그대로 출력된다.
- 직전 명령의 성공 여부는 $?에 담긴다. 0이면 성공, 그 밖의 값은 실패다.
쉘 스크립트 기초 문법 2: 조건문
#!/bin/bash
file="/etc/nginx/nginx.conf"
if [ -f "$file" ]; then
echo "설정 파일이 있습니다."
elif [ -d "/etc/nginx" ]; then
echo "디렉터리만 있습니다."
else
echo "nginx가 설치되어 있지 않습니다."
exit 1
fi| 조건 | 뜻 |
|---|---|
-f 파일 | 일반 파일이 있으면 참 |
-d 경로 | 디렉터리가 있으면 참 |
-z "$var" | 문자열이 비어 있으면 참 |
"$a" = "$b" | 문자열이 같으면 참 |
$a -eq $b | 숫자가 같으면 참(-ne, -gt, -lt, -ge, -le) |
[ 와 ] 안쪽 양옆에는 반드시 공백이 있어야 한다. if [-f “$file”]처럼 붙여 쓰면 오류가 난다. 초보자가 가장 많이 하는 실수다.
반복문과 함수
#!/bin/bash
# 목록 반복
for server in web1 web2 db1; do
echo "점검: $server"
done
# 숫자 반복
for i in {1..5}; do
echo "$i 번째"
done
# 파일을 한 줄씩 읽기
while read -r line; do
echo "읽은 줄: $line"
done < servers.txt
# 함수
log() {
echo "[$(date '+%F %T')] $1"
}
log "작업 시작"안전하게 실행하는 설정
스크립트 맨 위에 아래 한 줄을 넣으면, 중간에 명령이 실패하거나 정의하지 않은 변수를 쓸 때 바로 멈춘다. 잘못된 상태로 다음 명령이 계속 실행되는 사고를 막아 준다.
set -euo pipefail쉘 스크립트 기초 실전: 백업 스크립트
지금까지 배운 내용을 모아, 웹 디렉터리를 날짜별로 압축하고 7일이 지난 백업은 지우는 스크립트를 만들어 보자. 압축 명령은 tar 압축 사용법에서, 오래된 파일을 찾는 find는 find와 grep 사용법에서 자세히 다뤘다.
#!/bin/bash
set -euo pipefail
SRC="/var/www/html"
DEST="/backup/www"
KEEP_DAYS=7
TODAY=$(date +%Y%m%d)
LOG="/backup/backup.log"
log() {
echo "[$(date '+%F %T')] $1" >> "$LOG"
}
mkdir -p "$DEST"
if [ ! -d "$SRC" ]; then
log "원본 디렉터리가 없습니다: $SRC"
exit 1
fi
tar czf "$DEST/www_${TODAY}.tar.gz" -C "$(dirname "$SRC")" "$(basename "$SRC")"
log "백업 완료: www_${TODAY}.tar.gz"
find "$DEST" -name "www_*.tar.gz" -mtime +"$KEEP_DAYS" -delete
log "${KEEP_DAYS}일 지난 백업 정리 완료"이 스크립트를 /home/admin/scripts/backup.sh로 저장하고 실행 권한을 준 뒤 crontab에 등록하면 매일 자동으로 백업이 쌓인다. 문법 전체는 GNU Bash 공식 매뉴얼에서 확인할 수 있다.
# crontab -e 에 추가: 매일 새벽 3시 30분
30 3 * * * /home/admin/scripts/backup.sh마무리
쉘 스크립트는 거창한 프로그래밍이 아니라, 매일 치던 명령을 파일로 옮기는 데서 시작한다. 처음에는 명령 몇 줄을 묶는 것부터 시작해 변수와 조건문을 하나씩 더해 가면 된다. 백업 파일을 다른 서버로 복사해 두는 방법은 rsync 백업과 동기화 글에서 이어진다.
첫 댓글을 남겨보세요