Bash 스크립트에서 Case 문을 사용하는 방법

0
491

칠판에 도형을 범주로 분류하기
팟피차야/Shutterstock.com

Bash case 문은 강력하면서도 쓰기 쉽습니다. 이전 Linux 스크립트를 다시 방문하면 case 긴 대신 진술 if-then-else 성명.

사례 진술

대부분의 프로그래밍 언어에는 다음 버전이 있습니다. switch 또는 case 성명. 이들은 변수 값에 따라 프로그램 실행의 흐름을 지시합니다. 일반적으로 변수의 예상 가능한 값 각각에 대해 정의된 실행 분기와 하나의 포괄 또는 기본 다른 모든 값에 대한 분기.

논리적 기능은 다음의 긴 시퀀스와 유사합니다. if-then 진술 else 이전에 한 사람이 처리하지 않은 모든 것을 잡는 문 if 진술.

Bash 셸이란 무엇이며 Linux에 왜 중요한가요?

관련된Bash 셸이란 무엇이며 Linux에 왜 중요한가요?

Bash 구현 case 일치를 시도합니다 표현 조항 중 하나와 함께. 각 절을 차례로 살펴보고 일치하는 항목을 찾습니다. 무늬. 절의 패턴은 문자열이지만 반직관적으로 그렇다고 해서 숫자 값을 표현식으로 사용할 수 없다는 의미는 아닙니다.

일반 케이스

의 일반적인 형태 case 성명서는 다음과 같습니다.

case expression in 

  pattern-1)
    statement 
    ;;

  pattern-2) 
    statement
    ;;
    .
    .
    .

  pattern-N) 
    statement 
    ;;

  *) 
    statement 
    ;; 
esac

  • case 문은 다음으로 시작해야 합니다. case 키워드로 끝내고 esac 예어.
  • 표현은 평가되고 각 패턴과 비교됩니다. 일치하는 항목을 찾을 때까지.
  • 일치하는 절의 명령문이 실행됩니다.
  • 이중 세미콜론 “;;“는 절을 종료하는 데 사용됩니다.
  • 패턴이 일치하고 해당 절의 문이 실행되면 다른 모든 패턴은 무시됩니다.
  • 조항의 수에는 제한이 없습니다.
  • 별표 “*“는 기본 패턴을 나타냅니다. 표현식이 다른 패턴과 일치하지 않는 경우 case 문에서 기본 절이 실행됩니다.

간단한 예

이 스크립트는 가상 상점의 영업 시간을 알려줍니다. 그것은 사용 date 명령 +"%a" 단축된 요일 이름을 얻기 위한 형식 문자열. 이것은 DayName 변하기 쉬운.

#!/bin/bash

DayName=$(date +"%a")

echo "Opening hours for $DayName"

case $DayName in

  Mon)
    echo "09:00 - 17:30"
    ;;

  Tue)
    echo "09:00 - 17:30"
    ;;

  Wed)
    echo "09:00 - 12:30"
    ;;

  Thu)
    echo "09:00 - 17:30"
    ;;

  Fri)
    echo "09:00 - 16:00"
    ;;

  Sat)
    echo "09:30 - 16:00"
    ;;

  Sun)
    echo "Closed all day"
    ;;

  *)
    ;;
esac

해당 텍스트를 편집기에 복사하고 “open.sh”라는 파일로 저장합니다.

우리는 사용해야 할 것입니다 chmod 실행할 수 있도록 하는 명령입니다. 이 문서를 진행하면서 만드는 모든 스크립트에 대해 이 작업을 수행해야 합니다.

chmod +x open.sh

open.sh 스크립트를 실행 가능하게 만들기

이제 스크립트를 실행할 수 있습니다.

./open.sh

open.sh 스크립트 실행

스크린샷을 찍은 날은 금요일입니다. 즉, DayName 변수는 “Fri” 문자열을 보유합니다. 이는 “Fri)” 절의 “Fri” 패턴과 일치합니다.

절의 패턴은 큰따옴표로 묶을 필요가 없지만 그렇게 해도 해를 끼치지는 않습니다. 그러나 당신은 ~해야하다 패턴에 공백이 포함된 경우 큰따옴표를 사용합니다.

기본 절은 비어 있습니다. 앞의 절 중 하나와 일치하지 않는 것은 모두 무시됩니다.

그 스크립트는 작동하고 읽기 쉽지만, 길고 반복적입니다. 우리는 그 유형을 줄일 수 있습니다 case 아주 쉽게.

관련된: Linux에서 chmod 명령을 사용하는 방법

절에서 여러 패턴 사용

정말 깔끔한 기능은 case 문은 각 절에서 여러 패턴을 사용할 수 있다는 것입니다. 표현식이 이러한 패턴 중 하나와 일치하면 해당 절의 문이 실행됩니다.

다음은 한 달에 며칠이 있는지 알려주는 스크립트입니다. 30일, 31일 또는 2월의 경우 28일 또는 29일의 세 가지 답변만 있을 수 있습니다. 따라서 12개월이 있지만 세 개의 조항만 있으면 됩니다.

이 스크립트에서 사용자는 월 이름을 묻는 메시지가 표시됩니다. 패턴 일치를 대소문자를 구분하지 않도록 하기 위해 shopt 명령 -s nocasematch 옵션. 입력에 대문자, 소문자 또는 이 둘의 혼합이 포함되어 있는지 여부는 중요하지 않습니다.

#!/bin/bash

shopt -s nocasematch

echo "Enter name of a month"
read month

case $month in

  February)
    echo "28/29 days in $month"
    ;;

  April | June | September | November)
    echo "30 days in $month"
    ;;

  January | March | May | July | August | October | December)
    echo "31 days in $month"
    ;;

  *)
    echo "Unknown month: $month"
    ;;
esac

2월은 자체적으로 절을 가져오고 다른 모든 달은 30일 또는 31일에 따라 두 개의 절을 공유합니다. 다중 패턴 절은 파이프 기호 “|”를 사용합니다. 구분자로. 기본 케이스는 철자가 잘못된 월을 포착합니다.

이것을 “month.sh”라는 파일에 저장하고 실행 가능하게 만들었습니다.

chmod +x month.sh

스크립트를 여러 번 실행하고 대문자 또는 소문자를 사용하는지 여부가 중요하지 않음을 보여줍니다.

./month.sh

다른 대소문자 입력으로 month.sh 스크립트 실행

대문자와 소문자의 차이를 무시하도록 스크립트에 지시했기 때문에 철자가 올바른 월 이름은 세 가지 주요 절 중 하나에 의해 처리됩니다. 철자가 잘못된 월은 기본 절에 의해 포착됩니다.

Digits In case 문 사용

숫자나 숫자 변수를 표현식으로 사용할 수도 있습니다. 이 스크립트는 사용자에게 1..3 범위의 숫자를 입력하도록 요청합니다. 각 절의 패턴이 문자열임을 명확히 하기 위해 큰따옴표로 묶었습니다. 그럼에도 불구하고 스크립트는 여전히 사용자의 입력을 적절한 절과 일치시킵니다.

#!/bin/bash

echo "Enter 1, 2, or 3: "
read Number

case $Number in

  "1")
    echo "Clause 1 matched"
    ;;

  "2")
    echo "Clause 2 matched"
    ;;

  "3")
    echo "Clause 3 matched"
    ;;

  *)
    echo "Default clause matched"
    ;;
esac

이것을 “number.sh”라는 파일에 저장하고 실행 가능하게 만든 다음 실행합니다.

./number.sh

number.sh 스크립트 실행 및 다양한 사용자 입력 테스트

for 루프에서 case 문 사용

case 문은 단일 표현식과 패턴 일치를 시도합니다. 처리할 표현식이 많은 경우 case 내부의 진술 for 고리.

이 스크립트는 ls 파일 목록을 가져오는 명령입니다. 에서 for 루프에서 정규식과 유사하지만 다른 파일 글로빙이 각 파일에 차례로 적용되어 파일 확장자를 추출합니다. 이것은 Extension 문자열 변수.

그만큼 case 문은 다음을 사용합니다. Extension 변수를 절과 일치시키려는 표현식으로 사용합니다.

#!/bin/bash

for File in $(ls)

do
  # extract the file extension
  Extension=${File##*.}

  case "$Extension" in

    sh)
      echo " Shell script: $File"
      ;;

    md)
      echo " Markdown file: $File"
      ;;

    png)
      echo "PNG image file: $File"
      ;;

    *)
      echo "Unknown: $File"
      ;;
  esac
done

이 텍스트를 “filetype.sh”라는 파일에 저장하고 실행 가능하게 만든 다음 다음을 사용하여 실행합니다.

./filetype.sh

filetype.sh 스크립트 실행 및 파일 식별

우리의 미니멀리스트 파일 유형 식별 스크립트가 작동합니다.

관련된: Linux의 Bash에서 “Here Documents”를 사용하는 방법

case 문으로 종료 코드 처리

제대로 작동하는 프로그램은 종료될 때 종료 코드를 셸로 보냅니다. 기존 방식은 문제 없는 실행을 나타내기 위해 종료 코드 값 0을 사용하고 다른 유형의 오류를 나타내기 위해 하나 이상의 값을 사용합니다.

많은 프로그램은 0과 1만 사용합니다. 모든 오류 조건을 단일 종료 코드로 묶으면 문제 식별이 더 어려워지지만 일반적인 관행입니다.

Bash에서 변수로 작업하는 방법

관련된Bash에서 변수로 작업하는 방법

무작위로 0 또는 1의 종료 코드를 반환하는 “go-geek”이라는 작은 프로그램을 만들었습니다. 이 다음 스크립트는 go-geek. 다음을 사용하여 종료 코드를 획득합니다. $? 쉘 변수를 만들고 이를 표현식으로 사용합니다. case 성명.

실제 스크립트는 종료 코드를 생성한 명령의 성공 또는 실패에 따라 적절한 처리를 수행합니다.

#!/bin/bash

go-geek

case $? in

  "0")
    echo "Response was: Success"
    echo "Do appropriate processing in here"
    ;;

  "1")
    echo "Response was: Error"
    echo "Do appropriate error handling in here"
    ;;

  *)
    echo "Unrecognised response: $?"
    ;;
esac

이것을 “return-code.sh”라는 스크립트에 저장하고 실행 가능하게 만드십시오. 우리의 명령을 다른 명령으로 대체해야 합니다. go-geek 명령. 당신은 시도 할 수 있습니다 cd 존재하지 않는 디렉토리에 하나의 종료 코드를 얻은 다음 스크립트를 다음과 같이 편집하십시오. cd 액세스 가능한 디렉토리로 이동하여 종료 코드 0을 얻습니다.

스크립트를 몇 번 실행하면 다른 종료 코드가 case 성명.

./return-code.sh

다른 종료 코드의 처리를 보여주는 return-code.sh 스크립트 실행

가독성은 유지 관리에 도움이 됩니다.

예전 Bash 스크립트로 돌아가서 그들이 하는 일, 특히 다른 사람이 작성한 경우 어떻게 하는지 알아내는 것은 어려운 일입니다. 이전 스크립트의 기능을 수정하는 것은 훨씬 더 어렵습니다.

그만큼 case 문은 명확하고 쉬운 구문으로 분기 논리를 제공합니다. 윈윈입니다.

관련된: Windows 10에서 Linux Bash 셸을 설치하고 사용하는 방법