Linux

LINUX #7. Bash Script

Frisbeen 2025. 4. 15. 20:44

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 스크립트는 귀찮음을 줄이기 위한 도구! 반복되는 작업이 있다면 과감히 스크립트로 작성해보자.