Bash 기법: test, [, [문자열 이 비어 있 는 지 판단 하 는 용법

10042 단어 linuxbashshell
bash 에서 test 명령, [ 명령, [[ 명령 은 모두 일부 판단 에 사용 할 수 있다.예 를 들 어 이 세 명령 은 문자열 이 비어 있 는 지 여 부 를 판단 하 는 데 사용 할 수 있다.실제로 사용 할 때, 이 몇 가지 명령 의 용법 은 약간의 공통점 과 주의사항 이 있다.구체 적 인 설명 은 다음 과 같다.
test 명령 과 [명령 의 관계
bash 에서 [ 키 자 체 는 명령 입 니 다. if 명령 의 일부분 이 아 닙 니 다. help [ 명령 을 수행 하 는 것 은 다음 과 같 습 니 다.[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test"builtin, but the last argument must be a literal ] , to match the opening [ .
즉, [ 명령 은 test 명령 의 동의어 로 조건 식 에 대한 판단 결 과 는 test 명령 과 완전히 같 습 니 다. 그러나 [ 명령 은 이 명령 의 마지막 매개 변 수 는 ] 이 어야 합 니 다. 닫 힌 괄호 효과 로 보 입 니 다.
실제 사용 중 test 명령 과 [ 명령 은 항상 if 명령, while 명령 과 결합 하여 사용 된다. 그러나 이것 은 필수 적 인 것 이 아니다. test 명령 과 [ 명령 자 체 는 독립 된 명령 으로 단독으로 집행 할 수 있다.
그 다음 에는 test 명령 으로 용법 을 설명 할 것 이다. 이 설명 들 은 모두 [ 명령 에 적용 된다.
메모: ] 자신 은 bash 명령 이 아 닙 니 다. [ 명령 이 요구 하 는 매개 변수 일 뿐 마지막 매개 변수 여야 합 니 다.
메모: [ 명령 을 사용 할 때 가장 큰 오 류 는 이 명령 이후 에 빈 칸 을 추가 하지 않 은 것 입 니 다. 예 를 들 어 [string1 != string2] 이 쓰기 가 잘못 되 었 습 니 다. [ 명령 자체 가 명령 입 니 다. 이 명령 은 [ 입 니 다. 이 명령 뒤에 일부 인 자 를 따라 명령 이름과 인 자 를 빈 칸 으로 구분 해 야 합 니 다. [string1이 표기 법 은 실제 적 으로 [string1 라 는 명령 을 집행 할 것 이지 [ 명령 을 집행 하 는 것 이 아니다.
유사 한 것 은 ] 자체 가 하나의 매개 변수 이 고 빈 칸 으로 다른 매개 변 수 를 분리 해 야 합 니 다. string2] 이 글 씨 는 실제 적 으로 'string 2' 라 는 매개 변수 입 니 다.string2] 두 개의 인자 가 아 닙 니 다.
test 명령 으로 문자열 이 비어 있 는 지 여 부 를 판단 합 니 다.
집행 help test 명령 은 다음 과 같다.
test: test [expr]
    Evaluate conditional expression.
    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.

    The behavior of test depends on the number of arguments.
    Read the  bash manual page for the complete specification.

    String operators:
      -z STRING      True if string is empty.

      -n STRING
         STRING      True if string is not empty.

즉, test 명령 은 -z STRING 연산 자 를 사용 하여 STRING 문자열 의 길이 가 0 인지 아 닌 지 를 판단 하 는 것 이다.0 이면 빈 문자열 입 니 다. true 로 돌아 갑 니 다.구체 적 인 표기 법 은 test -z STRING 이 고, 사용 [ 명령 은 [ -z STRING ] 이 라 고 쓰 여 있다.-n STRING 연산 자 는 STRING 문자열 의 길이 가 0 인지 판단 합 니 다.0 이 아니라면 빈 문자열 이 아 닙 니 다. true 로 돌아 갑 니 다.구체 적 인 표기 법 은 test -n STRING 이 고, 사용 [ 명령 은 [ -n STRING ] 이 라 고 쓰 여 있다.-n 연산 자 를 생략 하고 test STRING 또는 [ STRING ] 로 직접 쓸 수 있 습 니 다.
주의: 실제 사용 시 다음 몇 가 지 를 주의해 야 합 니 다.
  • 변수 값 에 대응 하 는 문자열 이 비어 있 는 지 판단 할 때 반드시 쌍 따옴표 로 변수 값 을 묶 어야 합 니 다.그렇지 않 으 면 변수 값 이 비어 있 거나 빈 칸 이 있 을 때 이상 한 결 과 를 되 돌려 줍 니 다.예 를 들 어 test -n "$string" 로 쓰 고 test -n $string 로 쓰 는 것 을 권장 하지 않 습 니 다.
  • bash 는 0 을 true 로 하고 1 을 false 로 한다.위 test 명령 의 설명 도 마찬가지다.대부분의 프로 그래 밍 언어 는 1 을 true 로 하고 0 을 false 로 한다.판단 조건 의 집행 관 계 를 잘못 판단 하지 않도록 구분 에 주의해 야 한다.
  • help test 의 설명 에 따 르 면 test 명령 의 매개 변수 개 수 는 그의 행위 에 영향 을 줄 수 있다.구체 적 으로 man bash 의 설명 을 참고 하 세 요.서로 다른 매개 변수 개 수 는 test 명령 이 예상 치 못 한 결 과 를 되 돌려 줍 니 다.

  • 다음은 empty_string.sh 스 크 립 트 로 예 를 들 어 test 명령 과 [ 명령 으로 문자열 이 비어 있 는 지 여 부 를 판단 하 는 방법 입 니 다. 그 내용 은 다음 과 같 습 니 다.
    #!/bin/bash
    
    function empty_string()
    {
        if test -n $1; then
            echo '(1) -n $1  :' "No quote: not empty."
        fi
    
        if [ -z $1 ]; then
            echo '(2) -z $1  :' "No quote: empty."
        fi
    
        if test -n "$1"; then
            echo '(3) -n "$1":' "Quote   : not empty."
        fi
    
        if [ -z "$1" ]; then
            echo '(4) -z "$1":' "Quote   : empty."
        fi
    }
    
    empty_string "$1"

    이 스 크 립 트 는 test 명령 의 -n, -z 연산 자 를 사용 하여 스 크 립 트 에 들 어 오 는 첫 번 째 매개 변수 가 빈 문자열 인지 판단 하고 더 블 따옴표 와 더 블 따옴표 없 이 변 수 를 묶 은 테스트 결 과 를 비교 합 니 다.
    구체 적 인 집행 결 과 는 다음 과 같다.
    $ ./empty_string.sh go
    (1) -n $1  : No quote: not empty.
    (3) -n "$1": Quote   : not empty.
    $ ./empty_string.sh "go on"
    ./empty_string.sh: line 5: test: go: binary operator expected
    ./empty_string.sh: line 9: [: go: binary operator expected
    (3) -n "$1": Quote   : not empty.
    $ ./empty_string.sh
    (1) -n $1  : No quote: not empty.
    (2) -z $1  : No quote: empty.
    (4) -z "$1": Quote   : empty.

    이 를 통 해 알 수 있 듯 이 ./empty_string.sh go 명령 을 실행 하고 들 어 오 는 첫 번 째 매개 변수 값 은 빈 칸 을 포함 하지 않 았 으 며 $1 변수 값 에 더 블 따옴표 가 붙 지 않 았 다 는 판단 결과 가 정확 하 다../empty_string.sh "go on" 명령 을 실행 하고 들 어 오 는 첫 번 째 매개 변수 값 은 빈 칸 을 포함 합 니 다.$1 변수 값 에 더 블 따옴표 가 붙 지 않 은 문장의 실행 오류 가 발생 하여 'binary operator expected' 를 알려 줍 니 다.test 명령 은 -n, -z 연산 자 뒤에 하나의 인자 만 있 을 것 으로 예상 된다.이곳 의 test -n $1test -n test string 로 확장 되 었 다.-n 뒤에 두 개의 파 라 메 터 를 제 공 했 고 -n 은 모두 세 개의 매개 변수 로 실행 오류 가 발생 했다.두 개의 따옴표 로 $1 변 수 를 묶 으 면 전체 변 수 는 하나의 매개 변수 로 간주 되 고 test -n "$1" 명령 을 실행 하면 틀 리 지 않 습 니 다../empty_string.sh 명령 을 실행 하고 첫 번 째 인 자 를 제공 하지 않 아 테스트 결과 가 이상 합 니 다.-n $1$1 비어 있 지 않다 고 생각 했다.반면 -z $1$1 비어 있다 고 주장 했다.-z "$1" 만 첫 번 째 매개 변수 값 이 비어 있다 고 정확하게 판단 할 수 있다.
    첫 번 째 인 자 를 제공 하지 않 았 을 때 여기 $1 의 값 이 비어 아무것도 없 는 셈 이기 때문이다.test -n $1 문 구 는 bash 처 리 를 거 쳐 얻 은 것 은 test -n 이다.[ -z $1 ] 문 구 는 bash 처 리 를 거 친 후에 얻 은 것 은 [ -z ] 으로 test -z 에 해당 한다.test -ntest -z 의 귀환 결 과 는 모두 true 였 다.그래서 인쇄 $1 가 비어 있 고 비어 있 지 않 으 며 판단 결과 가 기대 에 부합 되 지 않 습 니 다.
    다시 한 번 볼 수 있 듯 이 -z "$1" 쌍 따옴표 로 변수 값 을 묶 어 예상 한 판단 결 과 를 얻 었 다.더 블 따옴표 를 추가 하면 많은 이상 현상 을 피 할 수 있다.
    실행 스 크 립 트 의 디 버 깅 정 보 를 인쇄 할 때 bash -x ./empty_string.sh[ -z $1 ] 확장 결과 의 차 이 를 볼 수 있 습 니 다.
    $ bash -x ./empty_string.sh
    + empty_string ''
    + test -n
    + echo '(1) -n $1  :' 'No quote: not empty.'
    (1) -n $1  : No quote: not empty.
    + '[' -z ']'
    + echo '(2) -z $1  :' 'No quote: empty.'
    (2) -z $1  : No quote: empty.
    + test -n ''
    + '[' -z '' ']'
    + echo '(4) -z "$1":' 'Quote   : empty.'
    (4) -z "$1": Quote   : empty.

    위의 코드 를 결합 하면 [ -z "$1" ] 확 장 된 디 버 깅 정 보 는 [ -z $1 ] 이 고 '[' -z ']' 뒤에 인자 가 없습니다.-z 확 장 된 결 과 는 [ -z "$1" ] 였 다.'[' -z '' ']' 뒤에 인자 -z 가 있 는데 이 매개 변수의 값 은 빈 문자열 입 니 다.
    문자열 이 비어 있 는 지 [명령 으로 판단 하기
    보기 ''help [[ 명령 설명 은 다음 과 같다.
    [[ ... ]]: [[ expression ]]
        Execute conditional command.
    
    Returns a status of 0 or 1 depending on the evaluation of the conditional
    expression EXPRESSION. Expressions are composed of the same primaries used
    by the 'test' builtin, and may be combined using the following operators:
        ( EXPRESSION )    Returns the value of EXPRESSION
        ! EXPRESSION      True if EXPRESSION is false; else false
        EXPR1 && EXPR2    True if both EXPR1 and EXPR2 are true; else false
        EXPR1 || EXPR2    True if either EXPR1 or EXPR2 is true; else false

    즉, [[ 명령 은 [[ 명령 이 지원 하 는 조건 표현 식 을 사용 하여 판단 할 수 있 습 니 다. 이들 의 차이 점 은 다음 과 같 습 니 다.
    위 에서 언급 한 바 와 같이 test 명령 은 마지막 매개 변 수 를 [ ] 이 어야 한다. ] 명령 은 하나의 명령 이 아니 라 [[ 명령 도 ]] 와 동시에 나타 나 야 한다. 그러나 ]] 자체 도 하나의 명령 이지 하나의 매개 변수 가 아니다. 그래서 [[ expression ]] 복합 명령 (compound command) 이 라 고 불 린 다.
    아래 의 예 에서 보 듯 이:
    $ ]
    ]: command not found
    $ ]]
    -bash: syntax error near unexpected token `]]'

    명령 ] 을 실행 하려 고 했 으 나 명령 을 찾 지 못 했다 는 것 은 이 명령 이 없다 는 것 을 알 수 있다.
    명령 을 실행 ]] 하면 명령 을 찾 을 수 없습니다. 문법 오류 만 알려 줍 니 다. 명령 을 실행 하기 전에 [[ 명령 이 있어 야 합 니 다. [[ 명령 과 ]] 명령 이 모두 명령 이기 때문에 빈 칸 으로 다른 매개 변수 와 분리 해 야 합 니 다.
    man bash 를 보면 다음 과 같은 설명 이 있 습 니 다.
    Word splitting and pathname expansion are not performed on the words between the [[ and ]]; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and quote removal are performed.
    즉, [[[[ 에서 변수 값 을 인용 할 때 변수 값 을 단어 로 나 누 지 않 습 니 다 (Word splitting). 변수 값 에 빈 칸 이 있 더 라 도 따옴표 로 묶 지 않 아 도 여러 개의 인자 로 나 누 지 않 습 니 다.]] 명령 과 test 명령 은 단 어 를 나 누 어 매개 변수 개수 에 변화 가 생 길 수 있 습 니 다. 앞의 몇 가지 예 를 참고 하 십시오.[ 문자열 이 비어 있 는 지 판단 하 는 예 는 다음 과 같 습 니 다.
    $ value=
    $ [[ -n $value ]]; echo $?
    1
    $ [[ -z $value ]]; echo $?
    0
    $ value="go on"
    $ [[ -n $value ]]; echo $?
    0
    $ [[ -n go on ]]; echo $?
    -bash: syntax error in conditional expression
    -bash: syntax error near 'on'

    value 변수 값 을 비 워 두 고 [[ 1 로 되 돌려 주 며, 이 변수 값 이 비 어 있 지 않 은 것 이 false 인지 확인 할 수 있 습 니 다.[[ -n $value ]] 0 으로 되 돌아 가 이 변수 값 이 비어 있 는 지 확인 합 니 다. [[ -z $value ]] 따옴표 가 붙 지 않 아 도 정확하게 판단 할 수 있 습 니 다. $value 명령 을 사용 하면 이상 을 판단 할 수 있 습 니 다.
    value 변수 값 이 빈 칸 을 포함 할 때 [ 는 정확하게 판단 할 수 있 지만 [[ -n $value ]] 로 직접 쓰 면 오류 가 발생 합 니 다.

    좋은 웹페이지 즐겨찾기