if-elif-else
"만약 이 조건이 참이라면 이걸 해라, 그렇지 않으면 저걸 해라." 프로그래밍에서 가장 기본적인 판단 구조입니다. Bash에서는 if 키워드로 시작해서 fi로 닫습니다. fi는 if를 뒤집은 것으로, 블록의 끝을 명확히 표시합니다.
기본 구문
가장 단순한 형태는 조건 하나에 동작 하나입니다.
if [[ 조건 ]]; then # 조건이 참일 때 실행fi
조건이 거짓일 때 다른 동작을 하려면 else를 추가합니다.
if [[ 조건 ]]; then # 참일 때else # 거짓일 때fi
세 가지 이상의 경우를 나누려면 elif를 사용합니다. elif는 "else if"의 줄임말로, 앞 조건이 거짓일 때 다음 조건을 검사합니다.
if [[ 조건1 ]]; then # 조건1이 참일 때elif [[ 조건2 ]]; then # 조건2가 참일 때elif [[ 조건3 ]]; then # 조건3이 참일 때else # 모든 조건이 거짓일 때fi
elif는 몇 개든 붙일 수 있지만, 너무 많아지면 case 문을 고려하는 것이 좋습니다.
조건 결합
하나의 조건식 안에 여러 조건을 묶을 수 있습니다.
| 연산자 | 의미 | 예시 |
|---|---|---|
&& |
AND. 두 조건 모두 참이어야 함 | [[ $a -gt 0 && $b -gt 0 ]] |
|| |
OR. 하나라도 참이면 됨 | [[ $a -eq 0 || $b -eq 0 ]] |
! |
NOT. 조건을 반전 | [[ ! -f "$file" ]] |
&&와 ||는 [[ ]] 안에서 사용하거나, 조건식 바깥에서 명령을 연결할 때도 사용합니다.
# [[ ]] 안에서 AND 사용if [[ $age -ge 18 && $age -lt 65 ]]; then echo "성인입니다."fi# 바깥에서 명령 연결[[ -d /tmp/mydir ]] || mkdir /tmp/mydir
한 줄 if 표현
조건에 따라 간단한 동작 하나만 할 때는 한 줄로 표현할 수 있습니다.
# 조건이 참이면 cmd1, 거짓이면 cmd2[[ 조건 ]] && cmd1 || cmd2
예를 들어 파일이 없으면 오류 메시지를 출력하고 종료합니다.
[[ -f "$1" ]] || { echo "파일이 없습니다."; exit 1; }
중괄호 { }로 여러 명령을 묶을 때는 마지막 명령 뒤에 세미콜론을 붙여야 합니다.
실습 1. 나이 구분 스크립트
나이를 입력받아 미성년자, 성인, 노인으로 구분하는 스크립트입니다.
#!/bin/bash# 새 파일: scripts/age_check.shecho -n "나이를 입력하세요: "read ageif [[ ! $age =~ ^[0-9]+$ ]]; then echo "오류: 숫자만 입력하세요." exit 1fiif [[ $age -lt 0 || $age -gt 150 ]]; then echo "오류: 유효하지 않은 나이입니다." exit 1fiif [[ $age -lt 19 ]]; then echo "${age}세 → 미성년자입니다."elif [[ $age -lt 65 ]]; then echo "${age}세 → 성인입니다."else echo "${age}세 → 노인입니다."fi
실행 결과는 다음과 같습니다.
$ bash scripts/age_check.sh
나이를 입력하세요: 25
25세 → 성인입니다.
$ bash scripts/age_check.sh
나이를 입력하세요: 열다섯
오류: 숫자만 입력하세요.
$ bash scripts/age_check.sh
나이를 입력하세요: 70
70세 → 노인입니다.
$age =~ ^[0-9]+$는 정규식 매칭입니다. ^[0-9]+$는 "처음부터 끝까지 숫자만"을 의미합니다. 문자가 섞여 있으면 오류를 출력하고 종료합니다.
실습 2. 파일 존재 여부 확인 스크립트
경로를 인자로 받아 존재 여부와 종류를 확인하고 그에 맞게 처리합니다.
#!/bin/bash# 새 파일: scripts/file_check.shtarget="$1"if [[ -z "$target" ]]; then echo "사용법: $0 <파일경로>" exit 1fiif [[ -f "$target" ]]; then size=$(wc -c < "$target") echo "파일 발견: $target (${size} bytes)" echo "내용 미리보기:" head -3 "$target"elif [[ -d "$target" ]]; then count=$(ls "$target" | wc -l) echo "디렉토리 발견: $target (항목 ${count}개)" ls "$target"else echo "$target 가 존재하지 않습니다." echo -n "새로 생성하시겠습니까? [y/N] " read answer if [[ "$answer" == "y" || "$answer" == "Y" ]]; then touch "$target" echo "파일을 생성했습니다: $target" else echo "취소했습니다." fifi
실행 결과는 다음과 같습니다.
$ bash scripts/file_check.sh /etc/hosts
파일 발견: /etc/hosts (220 bytes)
내용 미리보기:
127.0.0.1 localhost
127.0.1.1 ubuntu
::1 localhost ip6-localhost ip6-loopback
$ bash scripts/file_check.sh /etc
디렉토리 발견: /etc (항목 187개)
...
$ bash scripts/file_check.sh /tmp/newfile.txt
/tmp/newfile.txt 가 존재하지 않습니다.
새로 생성하시겠습니까? [y/N] y
파일을 생성했습니다: /tmp/newfile.txt
-z "$target"은 변수가 비어 있는지 확인합니다. 인자 없이 스크립트를 실행하면 사용법을 안내하고 종료합니다.