If-Else 를 사용한 조건부 논리

ShellBeginner
지금 연습하기

소개

GPS 를 사용해 자동차를 운전한다고 생각해 보세요. GPS 는 단순히 한 가지 경로만 안내하지 않고 도로 상황에 따라 반응합니다. 교통 체증이 있으면 경로를 다시 설정합니다. 회전해야 할 곳을 지나치면 경로를 다시 계산합니다.

스크립팅에서는 이를 조건부 논리라고 합니다. 조건부 논리가 없으면 스크립트는 명령을 무작정 나열해 실행할 뿐입니다. 조건부 논리를 사용하면 스크립트가 현재 상황을 확인하고 다음에 수행할 작업을 선택할 수 있습니다.

조건부 논리는 안정적인 자동화를 위한 기본 요소입니다. 실제 시스템의 상태는 항상 같지 않으므로, 좋은 스크립트는 상황을 가정하지 않고 그에 맞게 반응해야 합니다.

이 실습에서는 if와 else를 사용해 스크립트에 "두뇌"를 추가합니다.

다음 작업을 수행하도록 스크립트를 작성합니다.

  1. 실제 상태 확인: 파일을 열기 전에 해당 파일이 실제로 존재하는지 확인합니다.
  2. 의사 결정: 결과가 "예"이면 한 작업을 수행하고, "아니요"이면 다른 작업을 수행합니다.
  3. ID 확인: 스크립트를 실행할 권한 (Root) 이 사용자에게 있는지 확인합니다.

파일이 존재하는지 확인하기

좋은 스크립트는 신중한 운전자처럼 행동합니다. 실행하기 전에 먼저 확인합니다. Linux 에서 가장 일반적인 확인 중 하나는 "이 파일이 존재하는가?"입니다.

if 블록 안에서 -f 플래그 (파일 확인) 를 사용합니다. if를 경비원이라고 생각해 보세요. 조건이 충족될 때만 내부의 코드가 실행됩니다.

이 예제는 시스템 상태에 따라 의사 결정을 내리는 스크립트를 작성하는 첫 번째 실제 예제입니다. 이는 "명령을 순서대로 실행하기"에서 "환경을 확인한 후 작업을 선택하기"로 나아가는 중요한 단계입니다. 많은 시스템 관리 스크립트가 바로 이 패턴을 기반으로 작성됩니다.

먼저 프로젝트 디렉터리로 이동합니다.

cd ~/project

check_file.sh라는 새 스크립트를 만듭니다.

nano check_file.sh

다음 코드를 입력합니다. data.txt가 존재하는지 확인합니다.

#!/bin/bash

FILE="data.txt"

if [ -f "$FILE" ]; then
  echo "$FILE exists."
fi

논리 해석:

  • if [ ... ]; then: 경비원 역할을 합니다. 대괄호 안에서 조건을 확인합니다.
  • -f "$FILE": 확인할 내용입니다. "data.txt는 실제 파일인가?"를 묻습니다.
  • echo ...: 수행할 작업입니다. 조건이 참일 때만 실행됩니다.
  • fi: "Finish If"를 의미합니다. 조건문 영역이 끝났음을 Linux 에 알립니다.

[ ... ] 형식은 테스트를 실행할 때 사용하는 Bash 의 일반적인 문법입니다. 여기서는 파일의 속성을 확인합니다. Linux 와 Bash 는 이와 같은 테스트 연산자를 다양하게 제공하며, 이를 익히면 스크립트가 파일, 문자열, 숫자 및 권한을 판단할 수 있습니다.

저장 (Ctrl+O) 하고 종료 (Ctrl+X) 합니다.

실행 권한을 부여합니다.

chmod +x check_file.sh

테스트 1: 보이지 않는 파일

지금 스크립트를 실행합니다.

./check_file.sh

아무 일도 일어나지 않습니다. 출력이 없습니다.

이유는 data.txt가 존재하지 않기 때문입니다. 경비원이 "아니요"라고 판단했으므로 echo 명령을 건너뛰었습니다.

테스트 2: 보이는 파일

이제 파일을 만듭니다.

touch data.txt

스크립트를 다시 실행합니다.

./check_file.sh

이번에는 경비원이 "예"라고 판단하므로 다음 출력이 표시됩니다.

data.txt exists.

Else 블록 추가하기

출력이 없으면 혼란스러울 수 있습니다. 스크립트가 아무 작업도 하지 않았을 때 실패한 것인지, 정상적으로 끝난 것인지 알 수 없기 때문입니다. 이를 위한 대안이 필요합니다.

논리적으로 보면 이는 "갈림길"입니다.

  • 경로 A(if): 파일이 존재합니다. 정상입니다.
  • 경로 B(else): 파일이 없습니다. 파일을 수정합니다.

파일이 없으면 자동으로 생성하도록 스크립트를 수정합니다.

먼저 테스트 파일을 삭제하여 실제로 파일이 없는 상황을 테스트합니다.

rm data.txt

스크립트를 엽니다.

nano check_file.sh

다음과 같이 else 블록을 추가합니다.

#!/bin/bash

FILE="data.txt"

if [ -f "$FILE" ]; then
  echo "$FILE exists."
else
  echo "$FILE does not exist. Creating it now..."
  touch "$FILE"
fi

논리:

if 조건이 참이면 첫 번째 부분을 실행합니다.

if 조건이 거짓이면 else 부분을 실행합니다.

이런 스크립트는 단순히 정보를 출력하는 스크립트보다 실제 운영 작업에 더 가깝습니다. 무언가가 없다고 알리는 데 그치지 않고 상황을 바로잡기 때문입니다. 조건부 논리가 많은 설정 및 유지 관리 스크립트의 기반인 이유도 여기에 있습니다.

저장하고 종료합니다.

논리 테스트

스크립트를 실행합니다. data.txt가 없으므로 경로 B 를 실행해야 합니다.

./check_file.sh

출력:

data.txt does not exist. Creating it now...

즉시 다시 실행합니다. 이제 data.txt가 존재하므로 경로 A 를 실행해야 합니다.

./check_file.sh

출력:

data.txt exists.

이제 스크립트는 "멱등적 (Idempotent)"입니다. 즉, 100 번 실행해도 오류가 발생하지 않고 항상 올바른 결과 (파일이 존재하는 상태) 를 보장합니다.

이 용어는 DevOps 에서 자주 사용됩니다. 멱등적인 작업은 명령을 몇 번 실행했는지보다 최종 상태가 중요하므로 안전하게 반복할 수 있습니다. 따라서 작업이 재시도되는 상황에서도 자동화를 더욱 안정적으로 만들 수 있습니다.

Root 권한 확인하기

Linux 에는 잠겨 있는 문이 있습니다. 이 문을 열 수 있는 열쇠는 슈퍼 사용자 (Root) 만 가지고 있습니다. 일반 사용자로 시스템 유지 관리 스크립트를 실행하면 "Permission Denied" 오류가 발생합니다.

스마트한 스크립트는 문을 열기 전에 먼저 사용자의 ID 를 확인합니다.

Linux 에서는 모든 사용자에게 숫자로 된 ID(UID) 가 있습니다.

  • Root의 UID 는 항상 0입니다.
  • 일반 사용자의 UID 는 보통 1000 이상입니다.

사용자의 ID 를 확인하는 스크립트를 작성합니다.

check_root.sh를 만듭니다.

nano check_root.sh

다음 코드를 입력합니다.

#!/bin/bash

if [ "$UID" -eq 0 ]; then
  echo "You are running this script as root."
else
  echo "You are running this script as a regular user."
fi

코드 해석:

  • $UID: 현재 사용자의 ID 번호를 저장하는 변수입니다.
  • -eq: "EQuals"를 의미합니다. 숫자에는 -eq를 사용하고, 단어에는 =를 사용합니다.

이 코드는 테스트 문법을 사용하는 또 다른 예제입니다. [ ... ] 안에서 숫자를 비교할 때 Bash 는 -eq, -ne, -lt, -gt와 같은 연산자를 사용합니다. 셸은 단어를 비교하는지 숫자 값을 비교하는지 알아야 하므로 문자열 비교 연산자와 숫자 비교 연산자는 서로 다릅니다.

저장하고 종료합니다. 실행 권한을 부여합니다.

chmod +x check_root.sh

테스트

현재 labex로 로그인했으므로 일반 사용자입니다.

스크립트를 일반적으로 실행합니다.

./check_root.sh

스크립트는 0 이 아닌 사용자 ID 를 확인하고 다음과 같이 출력합니다.

You are running this script as a regular user.

이제 sudo를 사용해 슈퍼 사용자의 권한을 잠시 빌립니다.

sudo ./check_root.sh

sudo는 이 명령을 실행하는 동안에만 사용자의 ID 를 0 으로 바꿉니다. 스크립트는 이를 확인하고 다음과 같이 출력합니다.

You are running this script as root.

전문적인 설치 스크립트가 작동하는 방식이 바로 이렇습니다. Root 가 아니면 실행을 거부합니다.

목표는 모든 작업에 Root 권한을 요구하는 것이 아닙니다. 보호된 작업을 시도하기 전에 권한을 확인하는 것이 목적입니다. 잘 작성된 스크립트는 중간까지 실행한 후 나중에 혼란스러운 권한 오류를 발생시키는 대신, 초기에 명확한 설명과 함께 중지합니다.

요약

이제 스크립트에 두뇌를 추가했습니다.

이 실습에서는 다음 내용을 배웠습니다.

  1. 경비원 (if): 파일이 존재하는지 (-f) 와 같은 조건을 확인합니다.
  2. 갈림길 (else): 조건이 "아니요"일 때를 위한 대안을 제공합니다.
  3. ID 확인: 숫자 비교 (-eq) 를 사용해 사용자의 권한을 확인합니다.

이제 스크립트는 단순한 명령 목록이 아닙니다. 환경에 맞게 동작을 조정하는 지능적인 프로그램입니다.