11강 / 20강
셸 스크립트 — 명령을 파일에 담기
손으로 하던 일을 컴퓨터에게 넘기기
매일 아침 서버에 들어가 이 다섯 줄을 칩니다.
cd /home/jit/shop tar -czf backup.tar.gz data/ mv backup.tar.gz /var/backups/ systemctl status shop df -h
일주일이면 35줄, 한 달이면 150줄을 손으로 칩니다. 게다가 어느 날은 순서를 헷갈리고, 어느 날은 한 줄을 빼먹어요.
해결책은 간단합니다. 파일에 적어 두고 그 파일을 실행하는 것. 그게 셸 스크립트입니다.
스크립트의 세 가지 준비물
#!/bin/bash셔뱅(shebang)첫 줄. "이 파일은 bash로 실행해"chmod +x실행 권한7강에서 배운 그것./파일.sh실행./ 를 꼭 붙여야 합니다서버에 이미 들어 있는 예제 스크립트
bash
내 가상 Ubuntu 서버에서 실행
실행 권한을 주고 실행합니다
bash
내 가상 Ubuntu 서버에서 실행
셸이 명령을 찾아다니는 폴더 목록 — 여기 없으면 못 찾습니다
bash
내 가상 Ubuntu 서버에서 실행
① 변수 — 값에 이름 붙이기
대입할 때는 $ 없이, 꺼내 쓸 때는 $ 를 붙입니다.
그리고 등호 양옆에 공백을 넣으면 안 됩니다. 초보자가 가장 많이 걸리는 함정이에요.
변수 이름은 영문자·숫자·밑줄만 쓸 수 있습니다. 한글 이름은 안 돼요
(이름=값 은 command not found 가 납니다).
대신 주석과 출력 글자는 한글로 얼마든지 쓸 수 있습니다.
$( ) 안에 명령을 넣으면 그 결과가 값이 됩니다
bash
내 가상 Ubuntu 서버에서 실행
② 조건문 — 상황을 보고 갈라지기
백업 스크립트라면 "폴더가 있으면 백업하고, 없으면 만들고"처럼 판단해야 하죠.
[ ] 안이 조건입니다. 대괄호 양옆의 공백을 빠뜨리지 마세요
bash
내 가상 Ubuntu 서버에서 실행
-f 파일파일이 있나-d 는 폴더가 있나-e 경로뭐라도 있나-x 는 실행할 수 있나-z "$값"비어 있나-n 은 비어 있지 않나$a -eq $b숫자가 같나-lt 작다 · -gt 크다"$a" = "$b"글자가 같나숫자와 글자는 비교법이 다릅니다③ 반복문 — 여러 개를 한꺼번에
for 는 목록을 하나씩 훑습니다
bash
내 가상 Ubuntu 서버에서 실행
🎮 스크립트 실험실
직접 써서 실행해 보세요. 예제를 눌러 불러온 뒤 고쳐 봐도 좋습니다. 여기서 쓴 스크립트는 여러분의 가상 서버에서 진짜로 실행됩니다.
진짜 쓸모 있는 스크립트를 만들어 봅시다
쇼핑몰을 백업하는 스크립트입니다. 19강에서 이걸 매일 새벽 3시에 자동 실행되게 만들 거예요.
편집 창이 뜹니다. 아래 내용을 붙여 넣고 Ctrl+O → Ctrl+X 하세요
bash
내 가상 Ubuntu 서버에서 실행
#!/bin/bash # 쇼핑몰 백업 스크립트 SRC=/home/jit/shop DEST=/home/jit/backups DATE=$(date +%Y%m%d) if [ ! -d "$DEST" ]; then mkdir -p "$DEST" echo "보관함을 만들었습니다: $DEST" fi tar -czf "$DEST/shop-$DATE.tar.gz" "$SRC" echo "백업 완료: shop-$DATE.tar.gz" ls -lh "$DEST"
실행 권한을 주고 돌려 봅니다
bash
내 가상 Ubuntu 서버에서 실행
🤔 확인 문제
스크립트 첫 줄의
#!/bin/bash 는 무슨 뜻인가?해설 셔뱅(shebang)이라고 합니다.
# 으로 시작하지만 첫 줄일 때만 특별한 뜻을 가져요. 파이썬 스크립트라면 #!/usr/bin/env python3 를 씁니다.🤔 확인 문제
NAME = "쇼핑몰" 이라고 썼더니 오류가 났습니다. 이유는?해설 셸은 공백으로 낱말을 나눕니다.
NAME = "쇼핑몰" 은 'NAME' 명령에 인자 두 개로 읽혀요. 반드시 NAME="쇼핑몰" 처럼 붙여서 씁니다.🤔 확인 문제
hello.sh 를 만들고 hello.sh 라고 쳤더니 command not found 가 났습니다. 가장 알맞은 해결은?해설 셸은
$PATH 에 있는 폴더에서만 명령을 찾습니다. 현재 폴더는 보안상 그 목록에 없어요. ./ 로 위치를 분명히 알려 주고, chmod +x 도 해 두어야 합니다.