
조건부 테스트는 논리 표현식의 결과에 따라 Linux Bash 스크립트 실행 흐름을 분기합니다. 이중 괄호 조건 테스트는 구문을 상당히 단순화하지만 여전히 고유한 문제가 있습니다.
단일 및 이중 브래킷
배쉬는 test 명령. 이를 통해 논리 표현식을 테스트할 수 있습니다. 식은 참 또는 거짓 응답을 나타내는 응답을 반환합니다. 진정한 응답은 0의 반환 값으로 표시됩니다. 0 이외의 값은 거짓을 나타냅니다.
다음을 사용하여 명령줄에서 명령 연결 && 운영자는 이 기능을 사용합니다. 명령은 이전 명령이 성공적으로 완료된 경우에만 실행됩니다.
테스트가 참이면 “예”라는 단어가 인쇄됩니다.
test 15 -eq 15 && echo "Yes"
test 14 -eq 15 && echo "Yes"

단일 브래킷 조건부 테스트는 다음을 모방합니다. test 명령. 대괄호 “로 표현을 묶습니다.[ ]“와 같은 방식으로 작동합니다. test 명령. 사실, 그것들은 동일한 소스 코드에서 생성된 동일한 프로그램입니다. 유일한 운영상의 차이점은 test 버전과 [ version handle help requests.
This is from the source code:
/* Recognize --help or --version, but only when invoked in the "[" form, when the last argument is not "]". 약어를 허용하지 않으려면 parse_long_options보다 직접 구문 분석을 사용하십시오. POSIX는 "[ --help" and "[ --version" to have the usual GNU behavior, but it requires "test --help" and "test --version" to exit silently with status 0. */
We can see the effect of this by asking test and [ for help and checking the response code sent to Bash.
test --help
echo $?
[ --help
echo $?

Both test and [ are shell builtins, meaning they are baked right into Bash. But there’s also a standalone binary version of [ .
type test
type [
whereis [

By contrast, the double bracket conditional tests [[ and ]] ~이다 키워드. [[ and ]] 논리 테스트도 수행하지만 구문이 다릅니다. 키워드이기 때문에 단일 브래킷 버전에서는 작동하지 않는 몇 가지 깔끔한 기능을 사용할 수 있습니다.
이중 대괄호 키워드는 Bash에서 지원되지만 다른 모든 셸에서는 사용할 수 없습니다. 예를 들어, Korn 쉘은 이를 지원하지만 일반 이전 쉘인 sh는 지원하지 않습니다. 모든 스크립트는 다음 줄로 시작합니다.
#!/bin/bash
이렇게 하면 스크립트를 실행하기 위해 Bash 셸을 호출할 수 있습니다.
관련된: Windows 10에서 Bash 셸 스크립트를 만들고 실행하는 방법
내장 및 키워드
우리는 사용할 수 있습니다 compgen 내장 프로그램을 나열하는 프로그램:
compgen -b | fmt -w 70
를 통해 출력을 배관하지 않고 fmt 우리는 자체 라인에 각 내장이 있는 긴 목록을 얻을 것입니다. 이 경우에는 내장 기능을 단락으로 함께 그룹화하는 것이 더 편리합니다.

우리는 볼 수있다 test 그리고 [ in the list, but ] 목록에 없습니다. 그만큼 [ command looks for a closing ] 표현식의 끝에 도달했을 때 감지하지만 ] 별도의 내장이 아닙니다. 우리가 보내는 신호일 뿐이야 [ to indicate the end of the parameter list.
To see the keywords, we can use:
compgen -k | fmt -w 70

The [[ and ]] 키워드가 둘 다 목록에 있습니다. [[ is a one keyword and ]] 다른 것입니다. 그들은 짝을 이루는 쌍입니다. if 그리고 fi , 그리고 case 그리고 esac .
Bash가 스크립트 또는 명령줄을 구문 분석하고 일치하는 닫는 키워드가 있는 키워드를 감지하면 그 사이에 나타나는 모든 것을 수집하고 키워드가 지원하는 모든 특수 처리를 적용합니다.
내장을 사용하면 내장 명령 다음에 오는 것이 다른 명령줄 프로그램의 매개변수와 똑같이 전달됩니다. 이는 스크립트 작성자가 변수 값의 공백과 같은 것에 대해 특별한 주의를 기울여야 함을 의미합니다.
쉘 글로빙
이중 브래킷 조건부 테스트는 쉘 글로빙을 사용할 수 있습니다. 이것은 별표 “를 의미합니다.*“는 “무엇이든”을 의미하도록 확장됩니다.
다음 텍스트를 편집기에 입력하거나 복사하여 “whelkie.sh”라는 파일에 저장합니다.
#!/bin/bash stringvar="Whelkie Brookes" if [[ "$stringvar" == *elk* ]]; then echo "Warning contains seafood" else echo "Free from molluscs" fi
스크립트를 실행 가능하게 만들려면 다음을 사용해야 합니다. chmod 명령 -x (실행) 옵션. 이 문서의 모든 스크립트를 시도하려면 이 작업을 수행해야 합니다.
chmod +x whelkie.sh

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

한 가지 주의할 점은 검색 문자열을 큰따옴표로 묶지 않는다는 것입니다. 그렇게하면 globbing이 발생하지 않습니다. 검색 문자열은 문자 그대로 처리됩니다.
다른 형태의 쉘 글로빙이 허용됩니다. 물음표 “?“는 단일 문자와 일치하고 단일 대괄호는 문자 범위를 나타내는 데 사용됩니다. 예를 들어 어떤 케이스를 사용해야 할지 모르는 경우 범위를 사용하여 두 가지 경우를 모두 처리할 수 있습니다.
#!/bin/bash stringvar="Jean-Claude van Clam" if [[ "$stringvar" == *[cC]lam* ]]; then echo "Warning contains seafood." else echo "Free from molluscs." fi
이 스크립트를 “damme.sh”로 저장하고 실행 가능하게 만드십시오. 우리가 그것을 실행할 때 조건문은 true로 해석되고 if 문의 첫 번째 절이 실행됩니다.
./damme.sh

인용 문자열
앞에서 큰따옴표로 묶는 문자열에 대해 언급했습니다. 그렇게 하면 셸 글로빙이 발생하지 않습니다. 관습에 따르면 그것이 좋은 습관이라고 말하지만, 당신은 그렇지 않습니다 필요 사용할 때 문자열 변수를 따옴표로 묶으려면 [[ and ]]공백을 포함하더라도. 다음 예를 보십시오. 둘 다 $stringvar 그리고 $surname 문자열 변수에는 공백이 포함되지만 조건문에서 둘 중 어느 것도 따옴표로 묶지 않습니다.
#!/bin/bash stringvar="van Damme" surname="van Damme" if [[ $stringvar == $surname ]]; then echo "Surnames match." else echo "Surnames don't match." fi
이것을 “surname.sh”라는 파일에 저장하고 실행 가능하게 만드십시오. 다음을 사용하여 실행하십시오.
./surname.sh

공백이 포함된 두 문자열에도 불구하고 스크립트는 성공하고 조건문은 true로 확인됩니다. 이는 공백이 포함된 경로 및 디렉토리 이름을 처리할 때 유용합니다. 여기서, -d 변수에 유효한 디렉토리 이름이 포함되어 있으면 옵션이 true를 반환합니다.
#!/bin/bash
dir="/home/dave/Documents/Needs Work"
if [[ -d ${dir} ]];
then
echo "Directory confirmed"
else
echo "Directory not found"
fi
자신의 컴퓨터에 있는 디렉토리를 반영하도록 스크립트의 경로를 변경하고 “dir.sh”라는 파일에 텍스트를 저장하고 실행 가능하게 하면 이것이 작동하는 것을 볼 수 있습니다.
./dir.sh

관련된: Bash에서 변수로 작업하는 방법
파일 이름 Globbing Gotchas
흥미로운 차이점 [ ] 그리고 [[ ]] globbing이 포함된 파일 이름과 관련됩니다. “*.sh” 형식은 모든 스크립트 파일과 일치합니다. 단일 브래킷 사용 [ ] 단일 스크립트 파일이 없으면 실패합니다. 둘 이상의 스크립트를 찾으면 오류가 발생합니다.
다음은 단일 대괄호 조건이 있는 스크립트입니다.
#!/bin/bash if [ -a *.sh ]; then echo "Found a script file" else echo "Didn't find a script file" fi
이 텍스트를 “script.sh”에 저장하고 실행 가능하게 만들었습니다. 디렉터리에 몇 개의 스크립트가 있는지 확인한 다음 스크립트를 실행했습니다.
ls
./script.sh

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

조건부 테스트는 true를 반환하고 스크립트는 오류를 일으키지 않습니다. 이중 대괄호를 사용하도록 스크립트를 편집하면 세 번째 유형의 동작이 제공됩니다.
#!/bin/bash if [[ -a *.sh ]]; then echo "Found a script file" else echo "Didn't find a script file" fi
이것을 “dscript.sh”라는 파일에 저장하고 실행 가능하게 만들었습니다. 많은 스크립트가 있는 디렉토리에서 이 스크립트를 실행하면 오류가 발생하지 않지만 스크립트는 스크립트 파일을 인식하지 못합니다.
이중 괄호를 사용하는 조건문은 디렉토리에 실제로 “*.sh”라는 파일이 있는 드문 경우에만 true로 해석됩니다.
./dscript.sh

논리 AND 및 OR
이중 괄호를 사용하면 && 그리고 || 논리 AND 및 OR 연산자로.
10은 10과 같기 때문에 이 스크립트는 조건문을 true로 해석해야 합니다. 그리고 25는 26보다 작습니다.
#!/bin/bash first=10 second=25 if [[ first -eq 10 && second -lt 26 ]]; then echo "Condition met" else echo "Condition failed" fi
이 텍스트를 “and.sh”라는 파일에 저장하고 실행 가능하게 만든 다음 다음과 같이 실행합니다.
./and.sh

스크립트는 예상대로 실행됩니다.
이번에는 우리가 사용할 || 운영자. 10은 15보다 크지 않지만 25는 여전히 26보다 작기 때문에 조건문은 true로 확인되어야 합니다. 또는 두 번째 비교가 true이면 조건문 전체가 true로 확인됩니다.
이 텍스트를 “or.sh”로 저장하고 실행 가능하게 만드십시오.
#!/bin/bash first=10 second=25 if [[ first -gt 15 || second -lt 26 ]]; then echo "Condition met." else echo "Condition failed." fi
./or.sh

정규식
이중 괄호 조건문은 =~ 문자열의 정규식 검색 패턴을 문의 나머지 절반에 적용하는 연산자입니다. 정규식이 충족되면 조건문이 참인 것으로 간주됩니다. 정규식에서 일치하는 항목이 없으면 조건문이 false로 확인됩니다.
관련된: Linux에서 정규식(regexes)을 사용하는 방법
이 텍스트를 “regex.sh”라는 파일에 저장하고 실행 가능하게 만드십시오.
#!/bin/bash
words="one two three"
WordsandNumbers="one 1 two 2 three 3"
email="dave@fabricateddomain.co.uk"
mask1="[0-9]"
mask2="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}"
if [[ $words =~ $mask1 ]];
then
echo ""$words" contains digits."
else
echo "No digits found in "$words"."
fi
if [[ $WordsandNumbers =~ $mask1 ]];
then
echo ""$WordsandNumbers" contains digits."
else
echo "No digits found in "$WordsandNumbers"."
fi
if [[ $email =~ $mask2 ]];
then
echo ""$email" is a valid e-mail address."
else
echo "Couldn't parse "$email"."
fi
이중 대괄호의 첫 번째 세트는 문자열 변수를 사용합니다. $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

정규식이 숫자를 찾고 있지만 값에 숫자가 없기 때문에 첫 번째 조건문이 실패합니다. $words 문자열 변수.
두 번째 조건문이 성공하기 때문에 $WordsandNumbers 문자열 변수에 숫자가 포함되어 있습니다.
전자 메일 주소의 형식이 적절하기 때문에 최종 조건문이 성공합니다. 즉, true로 확인됩니다.
단 하나의 조건
이중 괄호 조건부 테스트는 스크립트에 유연성과 가독성을 제공합니다. 조건부 테스트에서 정규식을 사용할 수 있다는 것만으로도 사용 방법을 배우는 것이 정당화됩니다. [[ and ]].
스크립트가 Bash와 같이 이를 지원하는 셸을 호출하는지 확인하십시오.
관련된: Bash에 대해 알아야 할 15가지 특수 문자








