콘텐츠로 이동

Bash - 조건문 구조 if 및 case


목적: 이 문서에서는 다음을 수행하는 방법에 대해 알아볼 것 입니다:

✔ 조건문 if 구문을 사용하는 방법
✔ 조건문 case 구문을 사용하는 방법

🏁 linux, 스크립트, bash , 조건문 구조

지식: ⭐ ⭐
복잡성: ⭐ ⭐ ⭐

소요 시간: 20분


조건문 구조

$? 변수는 테스트의 결과나 명령 실행 결과를 알기 위해 사용될 수 있지만, 단순히 표시되며 스크립트의 실행에는 영향을 주지 않습니다.

하지만 조건문에서 사용할 수 있습니다. If(만약) 테스트가 then(성공한다면) 이 작업을 하고, otherwise(그렇지 않으면) 다른 작업을 수행합니다.

조건문 if의 구문은 다음과 같습니다:

if command
then
    command if $?=0
else
    command if $?!=0
fi

if 다음에 위치한 명령은 반환 코드($?)가 평가될 것이므로 어떤 명령이든 사용할 수 있습니다. test 명령을 사용하여 이 테스트의 결과(파일 존재, 변수가 비어 있지 않음, 쓰기 권한 설정)에 따라 여러 작업을 정의하는 것이 편리한 경우가 많습니다.

기존 명령(mkdir, tar, ...을 사용하면 성공할 경우 수행해야 할 동작이나 실패할 경우 표시해야 할 오류 메시지를 정의할 수 있습니다.

예시:

if [[ -e /etc/passwd ]]
then
    echo "The file exists"
else
    echo "The file does not exist"
fi

if mkdir rep
then
    cd rep
fi

else 블록이 새로운 if 구조로 시작하는 경우 elseif를 아래처럼 elif로 병합할 수 있습니다.

[...]
else
  if [[ -e /etc/ ]]
[...]

[...]
# 위와 동등한 표현
elif [[ -e /etc ]]
[...]

요약

if / then / else / fi 구조는 if 뒤에 배치된 명령을 평가합니다.

  • 만약 이 명령의 반환 코드가 0(true)이면 셸은 then 뒤에 있는 명령을 실행합니다.
  • 만약 반환 코드가 0이 아닌 값(false)이라면 셸은 else 뒤에 있는 명령을 실행합니다.

else 블록은 선택 사항입니다.

테스트 평가가 참일 때에만 일부 작업을 수행하고 거짓일 때는 아무것도 수행하지 않는 경우가 종종 있습니다.

단어 fi는 구조를 닫습니다.

then 블록에서 실행할 명령이 하나만 있는 경우, 더 간단한 구문을 사용할 수 있습니다.

$?true인 경우 실행할 명령은 && 뒤에 배치하고, $?false인 경우 실행할 명령은 ||(옵션) 뒤에 배치합니다.

예시:

[[ -e /etc/passwd ]] && echo "The file exists" || echo "The file does not exist"
mkdir dir && echo "The directory is created".

또한 if보다 가볍게 변수를 평가하고 대체할 수 있는 구조를 사용할 수도 있습니다.

다음 구문은 중괄호를 구현한 것입니다:

  • 변수가 비어 있는 경우 대체 값을 표시합니다.
    ${variable:-value}
    
  • 변수가 비어 있지 않은 경우 대체 값을 표시합니다.
    ${variable:+value}
    
  • 변수가 비어있는 경우 변수에 새 값을 할당합니다:
    ${variable:=value}
    

예시:

name=""
echo ${name:-linux}
linux
echo $name

echo ${name:=linux}
linux
echo $name
linux
echo ${name:+tux}
tux
echo $name
linux

힌트

if, then, else, fi 또는 앞에서 설명한 간단한 구문 예제를 사용할지 결정할 때에는 스크립트의 가독성을 염두에 두세요. 자신 외에 아무도 스크립트를 사용하지 않을 경우 자신에게 가장 적합한 것을 사용할 수 있습니다. 스크립트를 사용하는 사람이 단순히 본인뿐이라면 가장 효과적인 방법을 사용할 수 있습니다.그러나 다른 사람이 스크립트를 검토, 디버그 또는 추적해야 할 가능성이 있다면, 더 자체 문서화된 형식(if, then 등)을 사용하거나 스크립트를 수정하고 사용할 수 있는 사람들에게 실제로 간단한 구문이 이해될 수 있도록 스크립트를 철저히 문서화하는 것이 중요합니다. 스크립트 문서화는 항상 좋은 습관이며, 이 문서의 앞부분에서 여러 번 언급되었습니다.

대체 조건문: case 구조

연속적인 if 구조는 빠르게 복잡하고 번거로워질 수 있습니다. 동일한 변수의 평가와 관련하여 여러 분기가 있는 조건문 구조를 사용할 수 있습니다. 변수의 값은 지정되거나 가능성 목록에 속할 수 있습니다.

와일드카드를 사용할 수 있습니다.

case ... in / esac 구조는 case 뒤에 배치된 변수를 평가하고 정의된 값과 비교합니다.

첫 번째 일치하는 값에서 );; 사이에 있는 명령이 실행됩니다.

평가된 변수와 제안된 값들은 문자열 또는 명령의 하위 실행 결과일 수 있습니다.

구조의 끝에 배치된 * 선택지는 이전에 테스트되지 않은 모든 값에 대해 실행될 작업을 나타냅니다.

조건문 case의 구문은 다음과 같습니다:

case $variable in
  value1)
    commands if $variable = value1
    ;;
  value2)
    commands if $variable = value2
    ;;
  [..]
  *)
    commands for all values of $variable != of value1 and value2
    ;;
esac

값이 변동될 수 있는 경우, 가능성을 지정하기 위해 와일드카드 []를 사용하는 것이 좋습니다:

[Yy][Ee][Ss])
  echo "yes"
  ;;

| 문자를 사용하면 값 또는 다른 값을 지정할 수도 있습니다.

"yes" | "YES")
  echo "yes"
  ;;

Author: Antoine Le Morvan

Contributors: Steven Spencer