Bash 기법: test, [, [문자열 이 비어 있 는 지 판단 하 는 용법
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
로 쓰 는 것 을 권장 하지 않 습 니 다.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 $1
은 test -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 -n
와 test -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 ]]
로 직접 쓰 면 오류 가 발생 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.