
Bash case 문은 강력하면서도 쓰기 쉽습니다. 이전 Linux 스크립트를 다시 방문하면 case 긴 대신 진술 if-then-else 성명.
사례 진술
대부분의 프로그래밍 언어에는 다음 버전이 있습니다. switch 또는 case 성명. 이들은 변수 값에 따라 프로그램 실행의 흐름을 지시합니다. 일반적으로 변수의 예상 가능한 값 각각에 대해 정의된 실행 분기와 하나의 포괄 또는 기본 다른 모든 값에 대한 분기.
논리적 기능은 다음의 긴 시퀀스와 유사합니다. if-then 진술 else 이전에 한 사람이 처리하지 않은 모든 것을 잡는 문 if 진술.
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

스크린샷을 찍은 날은 금요일입니다. 즉, 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

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

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

우리의 미니멀리스트 파일 유형 식별 스크립트가 작동합니다.
관련된: Linux의 Bash에서 “Here Documents”를 사용하는 방법
case 문으로 종료 코드 처리
제대로 작동하는 프로그램은 종료될 때 종료 코드를 셸로 보냅니다. 기존 방식은 문제 없는 실행을 나타내기 위해 종료 코드 값 0을 사용하고 다른 유형의 오류를 나타내기 위해 하나 이상의 값을 사용합니다.
많은 프로그램은 0과 1만 사용합니다. 모든 오류 조건을 단일 종료 코드로 묶으면 문제 식별이 더 어려워지지만 일반적인 관행입니다.
무작위로 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

가독성은 유지 관리에 도움이 됩니다.
예전 Bash 스크립트로 돌아가서 그들이 하는 일, 특히 다른 사람이 작성한 경우 어떻게 하는지 알아내는 것은 어려운 일입니다. 이전 스크립트의 기능을 수정하는 것은 훨씬 더 어렵습니다.
그만큼 case 문은 명확하고 쉬운 구문으로 분기 논리를 제공합니다. 윈윈입니다.
관련된: Windows 10에서 Linux Bash 셸을 설치하고 사용하는 방법








