bash script는 확장자 .sh인 파일로 저장
보통은 .sh 확장자를 쓰지만, 리눅스에서는 사실 확장자 자체가 필수가 아님. 다만 관례적으로 .sh를 붙여서 관리한다는 정도.
이걸 우린 왜 써야할까?
복잡한 명령어 작업을 자동화하기 위해!
#!/bin/bash
echo "백업을 시작합니다..."
cp -r /home/user/data /home/user/backup
echo "백업이 완료되었습니다!"
위 3줄을 자주 실행해야 한다면? 매번 입력하기 귀찮음 → 이걸 backup.sh에 담고 ./backup.sh 로 간단히 실행 가능!
어떻게 동작하는가?
프로그램 실행 = 복사본을 메모리에 올림 → 프로세스 생성
터미널 1: cp a.txt b.txt
터미널 2: cp c.txt d.txt
→ cp 프로세스가 2개 동시 실행됨.
터미널을 열면?
- Bash 프로세스 하나가 뜬다
- 사용자의 명령어 입력을 기다리는 셸
스크립트를 실행하면?
- 기존 Bash 안에서 돌아가는 게 아님
- 새로운 프로세스가 만들어짐
즉, ./myscript.sh 는 "bash가 새롭게 하나 더 생겨서 거기서 스크립트 실행"하는 구조.
환경변수 $PATH
- $PATH = 명령어를 어디서 찾을지에 대한 디렉토리 목록
- 예: ls, cp 등을 입력하면 $PATH 내에서 해당 실행 파일을 탐색함
- . (현재 디렉토리)는 기본적으로 포함 안됨 → 직접 경로를 명시해야 함
./hello.sh
이렇게 현재 디렉토리에서 직접 실행해야 한다.
실행 전 꼭 해야 할 것: 실행 권한 부여
chmod +x hello.sh
+x 옵션으로 실행 권한 부여해야 실행 가능!
Shebang (#!)
스크립트의 첫 줄에 다음을 추가:
#!/bin/bash
→ 이 스크립트는 bash로 해석해달라는 의미
Bash에서 변수 다루기
일반 변수 (내가 만든 변수)
name="Alice"
echo $name
🔑 규칙:
- 선언 시엔 $ 없이
- 참조 시엔 $ 붙이기
- 공백 있으면 큰따옴표로 감싸기
myvar="HELLO WORLD" # ✅
위치 매개변수 ($1, $2, ...)
#!/bin/bash
cp $1 $2
echo Details for $2
ls -lh $2
- $1 = 첫 번째 인자
- $2 = 두 번째 인자
실행 예: ./copy.sh a.txt b.txt
따옴표 처리 (중요)
myvar='Hello World'
newvar="More $myvar" # 변수 해석 O
newvar='More $myvar' # 변수 해석 X
- 큰따옴표: 변수 해석 O
- 작은따옴표: 변수 해석 X
명령어 결과를 변수에 담기: $(...)
myvar=$(ls)
count=$(ls /etc | wc -l)
echo "There are $count entries in /etc"
명령어 실행 결과를 변수로 받을 땐 $(...) 사용
export로 변수 전달
- 스크립트끼리는 기본적으로 변수 독립
- export 한 변수만 외부에서 인식 가능
export VAR_NAME="hello"
수 연산: $(()) 또는 let
a=5
b=3
sum=$((a + b))
echo $sum
조건문 if
if [ $1 -gt 100 ]; then
echo "$1은 100보다 큽니다."
fi
- -gt: greater than
- -lt: less than
- -eq: equal
주의: 조건문 안에 공백 필수!
test 명령어
test 1 -gt 100
echo $? # → 1 (false)
- $? = 직전 명령의 종료 상태
- 0 = true / 1 = false
리눅스에선 0이 성공(true), 1은 실패(false) 라는 점 주의!
use BASH SCRIPT!
체크리스트 Bash 스크립트는 귀찮음을 줄이기 위한 도구! 반복되는 작업이 있다면 과감히 스크립트로 작성해보자.
'Linux' 카테고리의 다른 글
SSH Key 설정 과정 정리 (0) | 2025.04.07 |
---|---|
🐧 macOS에서 Multipass + Ubuntu 서버 만들기 & SSH 접속 정리 (0) | 2025.04.02 |
🐧 Multipass로 Ubuntu VM 설정하기 (macOS 기준) (0) | 2025.03.31 |