SERVER/Linux

Linux - 쉘 스크립트 if문 (조건에 따라 스크립트 흐름을 분기 처리)

hanker 2025. 4. 17. 15:41
반응형

쉘 제어문 중 if 문은 조건 검사 결과에 따라 스크립트의 실행 흐름을 분기처리 해준다.

 

- 조건이 참(True) 인 경우에만 특정 스크립트를 실행한다.

- 조건이 거짓(False)일 때에는 건너뛰거나 다른 분기를 실행한다.


 

1. 기본 구조
if <조건>; then
  # 조건이 참일 때 실행할 명령들
elif <다른_조건>; then
  # 첫 번째 조건이 거짓이고, 이 조건이 참일 때 실행
else
  # 위 모든 조건이 거짓일 때 실행
fi

- ifthen: 조건이 참이면 해당 블록 실행

- 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

hanker.sh 결과

장점: 모든 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   # 음수

 

반응형