Linux - 쉘 스크립트 if문 (조건에 따라 스크립트 흐름을 분기 처리)
쉘 제어문 중 if 문은 조건 검사 결과에 따라 스크립트의 실행 흐름을 분기처리 해준다.
- 조건이 참(True) 인 경우에만 특정 스크립트를 실행한다.
- 조건이 거짓(False)일 때에는 건너뛰거나 다른 분기를 실행한다.
1. 기본 구조
if <조건>; then
# 조건이 참일 때 실행할 명령들
elif <다른_조건>; then
# 첫 번째 조건이 거짓이고, 이 조건이 참일 때 실행
else
# 위 모든 조건이 거짓일 때 실행
fi
- if … then: 조건이 참이면 해당 블록 실행
- elif: 여러 조건을 순차 검사
- else: 모든 분기가 거짓일 때 실행
- fi: if 블록 종료 표시
* 새로 생성 시 읽기 권한 추가 해야함 (chmod +x 파일명)
2. [ … ] (POSIX 테스트)
vi hanker.sh
#!/bin/bash
value=5
# 숫자 비교: -gt(>), -lt(<), -eq(==)
if [ "$value" -gt 0 ]; then
echo "value는 양수이다."
else
echo "value는 0이거나 음수이다."
fi
# 파일 존재 여부: -f(파일), -d(디렉터리)
if [ -f "/etc/passwd" ]; then
echo "/etc/passwd 파일이 존재한다."
fi
장점: 모든 POSIX 쉘에서 동작
주의: [ 와 ] 사이에 반드시 공백 필요, 변수는 인용 처리("$var")
3. [[ … ]] (Bash 고급 테스트)
vi hanker.sh
#!/bin/bash
str="hello_hanker.txt"
# 문자열 비교 및 패턴 매칭(globbing)
if [[ $str == *.txt ]]; then
echo "텍스트 파일입니다."
fi
# 정규식 매칭
if [[ $str =~ ^hello_ ]]; then
echo "hello_ 로 시작합니다."
fi
장점
- 글로빙(*, ?) 지원
- =~ 로 정규식 사용 가능
- 공백·특수문자 안전 처리
주의: [[ 와 ]] 사이에 반드시 공백 필요
4 (( … )) (산술 비교)
vi hanker.sh
#!/bin/bash
a=10
b=20
# 산술 표현식 사용: <, >, ==, <=, >=
if (( a < b )); then
echo "a가 b보다 작다."
fi
# 복합 연산
if (( (a + b) == 30 )); then
echo "합이 30이다."
fi
장점: -eq, -gt 대신 ==, < 등 직관적 기호 사용
주의: (( 와 )) 사이에 반드시 공백 필요하고, 오직 정수 계산에만 사용
5. 한줄 분기 (짧은 표현)
vi hanker.sh
#!/bin/bash
# 파일 읽기 권한 체크: 성공하면 echo "읽기 가능", 실패하면 echo "읽기 불가능"
[ -r "/var/log/syslog" ] && echo "읽기 가능" || echo "읽기 불가능"
장점: 한 줄로 간단 분기
주의: 앞 명령 실패 시(exit status ≠ 0) || 블록 실행
6. 중첩 분기 예
#!/bin/bash
num=$1
if (( num > 0 )); then
echo "양수"
elif (( num < 0 )); then
echo "음수"
else
echo "0입니다."
fi
# 추가로 문자열 길이 검사
read -p "문자열 입력: " txt
if [[ -z $txt ]]; then
echo "빈 문자열입니다."
elif (( ${#txt} < 5 )); then
echo "5글자 미만입니다."
else
echo "충분한 길이입니다."
fi
실행 : 실행할 스크립트 명 뒤에 파라미터를 붙힐 수 있다. (./hanker.sh 5) 5가 파라미터, read 명령어에 -p옵션으로 프롬프트에서 입력 받은 내용으로 분기 처리
7. 성능·보안 고려사항
성능
내부 테스트 문법([, [[, (())는 경량이므로 반복문 안에서도 부담 적음
외부 명령 호출(grep, awk)은 필요 시 최소화
보안
변수 인용: "${var}" 처럼 항상 인용해 공백·특수문자 공격 방지
eval 사용 금지: 사용자 입력을 직접 실행하지 않기
예시 )
cmd="ls -l /tmp"
eval "$cmd"
set -euo pipefail
옵션 | 설명 | 예시 |
-e | 에러 발생 시 즉시 스크립트 종료 | 어떤 명령이든 반환 코드($?)가 0이 아니면 스크립트 바로 종료 |
-u | 정의되지 않은 변수 사용 금지 | 존재하지 않는 변수를 참조하면 에러(unbound variable) 발생 후 종료 |
-o pipefail | 파이프라인 오류 포착 | cmd1 | cmd2 중 하나라도 실패(return code != 0)하면 파이프 전체가 실패로 간주 |
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
8. 테스트 방법 정리
8-1. 문법 검증
bash -n script.sh
8-2. 정적 분석 (설치 필요)
shellcheck script.sh
8-3. 단위 테스트
다양한 파라미터로 실행해 분기 로직 확인
./script.sh 5 # 양수
./script.sh 0 # 0
./script.sh -3 # 음수