# for: 목록 순회for i in 1 2 3 4 5; do echo "번호 $i"done# for: C 스타일for ((i=1; i<=5; i++)); do echo "$i"done# for: 파일 순회 (실무 단골)for file in /var/log/*.log; do echo "처리: $file"done# while: 조건 동안 반복count=1while [ "$count" -le 5 ]; do echo "$count" count=$((count + 1)) # 산술 연산 $(( ))done# case: 다중 분기case "$1" in start) echo "시작" ;; stop) echo "중지" ;; *) echo "사용법: $0 {start|stop}" ;;esac
구조
종료 키워드
용도
for ... do ... done
done
목록·범위 순회
while ... do ... done
done
조건 동안 반복
case ... esac
esac
값에 따른 다중 분기
산술 연산: count=$((count + 1)) 또는 let count++. $(( )) 안에서는 $ 없이 변수명만 써도 된다.
case의 종료어는 esac(case 거꾸로), if는 fi. 거꾸로 읽는 종료 키워드를 정확히 알아야 한다.
# 함수 정의 (두 가지 문법)backup() { echo "백업 시작: $1" # 함수 인자도 $1, $2 return 0 # 종료 상태 반환(0~255)}function greet { echo "안녕 $1"}# 호출 (괄호 없이 인자 나열)backup /etcgreet alice
함수 인자는 스크립트처럼 $1, $2로 받는다.
return은 0~255의 종료 상태만 반환한다.
값을 돌려주려면 echo로 출력한 뒤 $(함수호출)로 받는다.
호출 문법: 함수는 backup /etc처럼 괄호 없이 인자를 나열해 호출한다. backup(/etc)는 틀린 문법.
#!/bin/bash# userlist.txt 각 줄에 사용자명 하나씩USERLIST="userlist.txt"while read username; do # 이미 있는 계정은 건너뜀 if id "$username" &>/dev/null; then echo "$username 이미 존재 — 건너뜀" else useradd "$username" echo "$username:initpass" | chpasswd # 초기 암호 설정 echo "$username 생성 완료" fidone < "$USERLIST" # 파일을 입력으로
while read 변수; do ... done < 파일은 파일을 한 줄씩 읽는 표준 관용구다.
done < 파일로 입력을 리다이렉션하는 위치를 정확히 기억해야 한다.
id "$user" &>/dev/null로 계정 존재 여부를 조용히 확인한다.
파일 한 줄씩 읽기: while read line; do ... done < file. 리다이렉션 < file은 done 뒤에 붙인다 — 시험에서 빈칸이 되기 쉽다.
bash -x script.sh # 실행 추적(각 줄 출력) — 디버깅 핵심bash -n script.sh # 문법만 검사(실행 안 함)set -e # 오류 시 즉시 중단set -u # 미정의 변수 사용 시 오류exit 0 # 성공 종료 (관례: 0=성공)exit 1 # 실패 종료 (0 아닌 값=실패)
디버깅: bash -x는 실행되는 모든 명령을 + 접두로 보여 줘 어디서 틀렸는지 추적한다. set -e는 한 줄이라도 실패하면 즉시 멈춘다.