Linux에서 이중 괄호 조건부 테스트를 사용하는 방법

게시 됨: 2022-01-29
Fatmawati achmad zaenuri/Shutterstock.com

조건부 테스트는 논리 표현식의 결과에 따라 Linux Bash 스크립트 실행 흐름을 분기합니다. 이중 괄호 조건 테스트는 구문을 상당히 단순화하지만 여전히 고유한 문제가 있습니다.

단일 및 이중 브래킷

Bash는 test 명령을 제공합니다. 이를 통해 논리 표현식을 테스트할 수 있습니다. 식은 참 또는 거짓 응답을 나타내는 응답을 반환합니다. 진정한 응답은 0의 반환 값으로 표시됩니다. 0 이외의 값은 거짓을 나타냅니다.

&& 연산자를 사용하여 명령줄에서 명령을 연결하면 이 기능이 사용됩니다. 명령은 이전 명령이 성공적으로 완료된 경우에만 실행됩니다.

테스트가 참이면 "예"라는 단어가 인쇄됩니다.

 테스트 15 -eq 15 && echo "예"
 테스트 14 -eq 15 && echo "예" 

Bash 테스트 명령의 간단한 예

단일 브래킷 조건부 테스트는 test 명령을 모방합니다. 대괄호 " [ ] "로 표현식을 감싸고 test 명령처럼 작동합니다. 사실, 그것들은 동일한 소스 코드에서 생성된 동일한 프로그램입니다. 유일한 작동상의 차이점은 test 버전과 [ 버전이 도움말 요청을 처리하는 방식입니다.

이것은 소스 코드에서 가져온 것입니다.

 /* --help 또는 --version을 인식하지만,
"[" 형식, 마지막 인수가 "]"가 아닌 경우. 직접 사용
수락을 피하기 위해 parse_long_options 대신 구문 분석
약어. POSIX는 "[ --help" 및 "[ --version"을 허용합니다.
일반적인 GNU 동작을 가지지만 "test --help"가 필요합니다.
및 "test --version"을 사용하여 상태 0으로 자동 종료합니다. */
광고

test[ 도움을 요청하고 Bash로 전송된 응답 코드를 확인함으로써 이것의 효과를 볼 수 있습니다.

 테스트 --도움말
 에코 $?
 [ --돕다
 에코 $? 

테스트에서 --help 사용 및 [

test[ 모두 shell builtins 이며, 이는 Bash에 바로 구워졌음을 의미합니다. 그러나 [ 의 독립 실행형 바이너리 버전도 있습니다.

 유형 테스트
 유형 [
 어디에 [ 

다양한 유형의 [ 및 테스트 명령 찾기

대조적으로 이중 괄호 조건부 테스트 [[]]키워드 입니다. [[]] 도 논리적 테스트를 수행하지만 구문이 다릅니다. 키워드이기 때문에 단일 브래킷 버전에서는 작동하지 않는 몇 가지 깔끔한 기능을 사용할 수 있습니다.

이중 대괄호 키워드는 Bash에서 지원되지만 다른 모든 셸에서는 사용할 수 없습니다. 예를 들어, Korn 쉘은 이를 지원하지만 일반 이전 쉘인 sh는 지원하지 않습니다. 모든 스크립트는 다음 줄로 시작합니다.

 #!/bin/bash

이렇게 하면 스크립트를 실행하기 위해 Bash 셸을 호출할 수 있습니다.

관련: Windows 10에서 Bash 셸 스크립트를 만들고 실행하는 방법

내장 및 키워드

우리는 내장을 나열하기 위해 compgen 프로그램을 사용할 수 있습니다:

 컴젠 -b | fmt -w 70
광고

fmt 를 통해 출력을 파이핑하지 않고 자체 라인에 각 내장이 있는 긴 목록을 얻을 수 있습니다. 이 경우에는 내장 기능을 단락으로 함께 그룹화하는 것이 더 편리합니다.

Bash 빌트인 나열

목록에서 test[ 를 볼 수 있지만 ] 은 나열되지 않습니다. [ 명령은 닫는 ] 을 찾아 표현식의 끝에 도달했을 때 감지하지만 ] 는 별도의 내장 함수가 아닙니다. 매개변수 목록의 끝을 나타내기 위해 [ 에 주는 신호일 뿐입니다.

키워드를 보려면 다음을 사용할 수 있습니다.

 컴젠 -k | fmt -w 70 

Bash 키워드 나열

[[]] 키워드는 모두 목록에 있습니다. [[ 는 하나의 키워드이고 ]] 는 다른 키워드이기 때문입니다. iffi , caseesac 와 같이 일치하는 쌍입니다.

Bash가 스크립트 또는 명령줄을 구문 분석하고 일치하는 닫는 키워드가 있는 키워드를 감지하면 그 사이에 나타나는 모든 것을 수집하고 키워드가 지원하는 모든 특수 처리를 적용합니다.

내장을 사용하면 내장 명령 다음에 오는 것이 다른 명령줄 프로그램의 매개변수와 똑같이 전달됩니다. 이는 스크립트 작성자가 변수 값의 공백과 같은 것에 대해 특별한 주의를 기울여야 함을 의미합니다.

쉘 글로빙

이중 브래킷 조건부 테스트는 쉘 글로빙을 사용할 수 있습니다. 이것은 별표 " * "가 "모든 것"을 의미하도록 확장됨을 의미합니다.

광고

다음 텍스트를 편집기에 입력하거나 복사하여 "whelkie.sh"라는 파일에 저장합니다.

 #!/bin/bash

stringvar="Whelkie 브룩스"

if [[ "$stringvar" == *elk* ]];
그 다음에
  echo "경고에는 해산물이 포함되어 있습니다"
또 다른
  echo "연체동물이 없습니다"
파이

스크립트를 실행 가능하게 하려면 -x (실행) 옵션과 함께 chmod 명령을 사용해야 합니다. 이 문서의 모든 스크립트를 시도하려면 이 작업을 수행해야 합니다.

 chmod +x whelkie.sh 

chmod를 사용하여 스크립트를 실행 가능하게 만들기

스크립트를 실행하면 문자열 "elk"가 주변에 있는 다른 문자에 관계없이 "Whelkie" 문자열에서 발견되었음을 알 수 있습니다.

 ./whelkie.sh 

whelkie.sh 스크립트 실행

한 가지 주의할 점은 검색 문자열을 큰따옴표로 묶지 않는다는 것입니다. 그렇게하면 globbing이 발생하지 않습니다. 검색 문자열은 문자 그대로 처리됩니다.

다른 형태의 쉘 글로빙이 허용됩니다. 물음표 " ? "는 단일 문자와 일치하고 단일 대괄호는 문자 범위를 나타내는 데 사용됩니다. 예를 들어 어떤 케이스를 사용해야 할지 모르는 경우 범위를 사용하여 두 가지 경우를 모두 처리할 수 있습니다.

 #!/bin/bash

stringvar="장 클로드 반 클램"

if [[ "$stringvar" == *[cC]lam* ]];
그 다음에
  echo "경고에는 해산물이 포함되어 있습니다."
또 다른
  echo "연체동물이 없습니다."
파이

이 스크립트를 "damme.sh"로 저장하고 실행 가능하게 만드십시오. 우리가 그것을 실행할 때 조건문은 true로 해석되고 if 문의 첫 번째 절이 실행됩니다.

 ./damme.sh 

damme.sh 스크립트 실행

인용 문자열

앞에서 큰따옴표로 묶는 문자열에 대해 언급했습니다. 그렇게 하면 셸 글로빙이 발생하지 않습니다. 규칙에 따르면 좋은 방법이라고 하지만 [[]] 를 사용할 때 공백이 포함된 경우에도 문자열 변수를 따옴표로 묶을 필요 가 없습니다. 다음 예를 보십시오. $stringvar$surname 문자열 변수에는 모두 공백이 포함되어 있지만 둘 다 조건문에서 인용되지 않습니다.

 #!/bin/bash

stringvar="반담"
성 = "반 담"

if [[ $stringvar == $surname ]];
그 다음에
echo "성이 일치합니다."
또 다른
echo "성이 일치하지 않습니다."
파이
광고

이것을 "surname.sh"라는 파일에 저장하고 실행 가능하게 만드십시오. 다음을 사용하여 실행하십시오.

 ./성.sh 

surname.sh 스크립트 실행

공백이 포함된 두 문자열에도 불구하고 스크립트는 성공하고 조건문은 true로 확인됩니다. 이는 공백이 포함된 경로 및 디렉토리 이름을 처리할 때 유용합니다. 여기서 -d 옵션은 변수에 유효한 디렉토리 이름이 포함된 경우 true를 반환합니다.

 #!/bin/bash

dir="/home/dave/Documents/작업 필요"

if [[ -d ${dir} ]];
그 다음에
  echo "디렉토리 확인됨"
또 다른
  echo "디렉토리를 찾을 수 없습니다"
파이

자신의 컴퓨터에 있는 디렉토리를 반영하도록 스크립트의 경로를 변경하고 "dir.sh"라는 파일에 텍스트를 저장하고 실행 가능하게 하면 이것이 작동하는 것을 볼 수 있습니다.

 ./dir.sh 

dir.sh 스크립트 실행

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

파일 이름 Globbing Gotchas

[ ][[ ]] 의 흥미로운 차이점은 파일 이름에 globbing이 포함되어 있다는 점입니다. "*.sh" 형식은 모든 스크립트 파일과 일치합니다. 단일 스크립트 파일이 없는 경우 단일 대괄호 [ ] 를 사용하면 실패합니다. 둘 이상의 스크립트를 찾으면 오류가 발생합니다.

다음은 단일 대괄호 조건이 있는 스크립트입니다.

 #!/bin/bash

if [ -a *.sh ];
그 다음에
  echo "스크립트 파일을 찾았습니다"
또 다른
  echo "스크립트 파일을 찾지 못했습니다"
파이

이 텍스트를 "script.sh"에 저장하고 실행 가능하게 만들었습니다. 디렉터리에 몇 개의 스크립트가 있는지 확인한 다음 스크립트를 실행했습니다.

 ./스크립트.sh 

script.sh 스크립트 실행

광고

Bash에서 오류가 발생합니다. 하나의 스크립트 파일을 제외하고 모두 제거하고 스크립트를 다시 실행했습니다.

 ./스크립트.sh 

디렉토리의 단일 스크립트로 script.sh 스크립트 실행

조건부 테스트는 true를 반환하고 스크립트는 오류를 일으키지 않습니다. 이중 대괄호를 사용하도록 스크립트를 편집하면 세 번째 유형의 동작이 제공됩니다.

 #!/bin/bash

if [[ -a *.sh ]];
그 다음에
  echo "스크립트 파일을 찾았습니다"
또 다른
  echo "스크립트 파일을 찾지 못했습니다"
파이

이것을 "dscript.sh"라는 파일에 저장하고 실행 가능하게 만들었습니다. 많은 스크립트가 있는 디렉토리에서 이 스크립트를 실행하면 오류가 발생하지 않지만 스크립트는 스크립트 파일을 인식하지 못합니다.

이중 괄호를 사용하는 조건문은 디렉토리에 실제로 "*.sh"라는 파일이 있는 드문 경우에만 true로 해석됩니다.

 ./dscript.sh 

dscript.sh 스크립트 실행

논리 AND 및 OR

이중 괄호를 사용하면 &&|| 논리 AND 및 OR 연산자로.

10은 10 이고 25는 26보다 작기 때문에 이 스크립트는 조건문을 true로 해석해야 합니다.

 #!/bin/bash

첫 번째 = 10
초=25

if [[ 첫 번째 -eq 10 && 두 번째 -lt 26 ]];
그 다음에
  echo "조건 충족"
또 다른
  echo "조건 실패"
파이
광고

이 텍스트를 "and.sh"라는 파일에 저장하고 실행 가능하게 만든 다음 다음과 같이 실행합니다.

 ./및.sh 

and.sh 스크립트 실행

스크립트는 예상대로 실행됩니다.

이번에는 || 운영자. 조건문은 10이 15보다 크지 않지만 25는 여전히 26보다 작기 때문에 참으로 해석되어야 합니다. 첫 번째 비교 두 번째 비교가 참인 한 조건문은 전체적으로 참으로 해석됩니다.

이 텍스트를 "or.sh"로 저장하고 실행 가능하게 만드십시오.

 #!/bin/bash

첫 번째 = 10
초=25

if [[ 첫 번째 -gt 15 || 두 번째 -lt 26 ]];
그 다음에
  echo "조건 충족."
또 다른
  echo "조건이 실패했습니다."
파이
 ./또는.sh 

or.sh 스크립트 실행

정규식

이중 괄호 조건문은 문자열의 정규식 검색 패턴을 문의 나머지 절반에 적용하는 =~ 연산자의 사용을 허용합니다. 정규식이 충족되면 조건문이 참인 것으로 간주됩니다. 정규식에서 일치하는 항목이 없으면 조건문이 false로 확인됩니다.

관련: Linux에서 정규식(regexes)을 사용하는 방법

이 텍스트를 "regex.sh"라는 파일에 저장하고 실행 가능하게 만드십시오.

 #!/bin/bash

단어="하나 둘 셋"
WordsandNumbers="하나 1 둘 2 셋 3"
이메일="[email protected]"

mask1="[0-9]"
mask2="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}"

if [[ $words =~ $mask1 ]];
그 다음에
  echo "\"$words\"는 숫자를 포함합니다."
또 다른
  echo "\"$words\"에 숫자가 없습니다."
파이

if [[ $WordsandNumbers =~ $mask1 ]];
그 다음에
  echo "\"$WordsandNumbers\"는 숫자를 포함합니다."
또 다른
  echo "\"$WordsandNumbers\"에 숫자가 없습니다."
파이

if [[ $email =~ $mask2 ]];
그 다음에
  echo "\"$email\"은 유효한 이메일 주소입니다."
또 다른
  echo "\"$email\"을 구문 분석할 수 없습니다."
파이

이중 대괄호의 첫 번째 세트는 문자열 변수 $mask1 을 정규식으로 사용합니다. 여기에는 0에서 9 사이의 모든 숫자에 대한 패턴이 포함됩니다. 이 정규식을 $words 문자열 변수에 적용합니다.

이중 대괄호의 두 번째 세트는 다시 $mask1 문자열 변수를 정규식으로 사용하지만 이번에는 $WordsandNumbers 문자열 변수와 함께 사용합니다.

광고

이중 대괄호의 마지막 세트는 문자열 변수 $mask2 에서 보다 복잡한 정규식 마스크를 사용합니다.

  • [A-Za-z0-9._%+-]+ : 대문자나 소문자, 0에서 9까지의 숫자, 마침표, 밑줄, 백분율 기호 또는 더하기 또는 빼기 기호인 모든 문자와 일치합니다. . " [] " 외부의 " + "는 찾은 만큼의 문자에 대해 해당 일치 항목을 반복한다는 의미입니다.
  • @ : "@" 문자만 일치합니다.
  • [A-Za-z0-9.-]+ : 대문자나 소문자, 0에서 9까지의 숫자, 마침표 또는 하이픈인 모든 문자와 일치합니다. " [ ] " 외부의 " + "는 찾은 만큼의 문자에 대해 해당 일치 항목을 반복한다는 의미입니다.
  • . : "."와 일치합니다. 캐릭터만.
  • [A-Za-z]{2,4} : 모든 대문자 또는 소문자와 일치합니다. " {2,4} "는 최소 2개, 최대 4개 문자와 일치함을 의미합니다.

이 모든 것을 종합하면 정규식 마스크가 이메일 주소가 올바르게 구성되었는지 확인합니다.

스크립트 텍스트를 "regex.sh"라는 파일에 저장하고 실행 가능하게 만듭니다. 스크립트를 실행할 때 이 출력을 얻습니다.

 ./regex.sh 

regex.sh 스크립트 실행

정규식이 숫자를 찾고 있지만 $words 문자열 변수에 있는 값에 숫자가 없기 때문에 첫 번째 조건문이 실패합니다.

$WordsandNumbers 문자열 변수에 숫자가 포함되어 있으므로 두 번째 조건문이 성공합니다.

광고

전자 메일 주소의 형식이 적절하기 때문에 최종 조건문이 성공합니다. 즉, true로 확인됩니다.

단 하나의 조건

이중 괄호 조건부 테스트는 스크립트에 유연성과 가독성을 제공합니다. 조건부 테스트에서 정규식을 사용할 수 있다는 것만으로도 [[]] 사용 방법을 배우는 것이 정당화됩니다.

스크립트가 Bash와 같이 이를 지원하는 셸을 호출하는지 확인하십시오.

관련: Bash에 대해 알아야 할 15가지 특수 문자