문자열이 비어 있지 않거나 쉘 스크립트에서 공백이 아닌지 확인하십시오.


92

문자열이 공백도 비어 있지 않은지 확인해야하는 다음 셸 스크립트를 실행하려고합니다. 그러나 언급 된 3 개의 모든 문자열에 대해 동일한 출력을 얻고 있습니다. "[["구문도 사용해 보았지만 아무 소용이 없습니다.

내 코드는 다음과 같습니다.

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

다음과 같은 출력이 나타납니다.

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

쉘 스크립팅에서 빈 문자열이 널 문자열로 알려져 있습니까?
Josiah Yoder

답변:


123

의 양쪽에 공백이 필요합니다 !=. 코드를 다음과 같이 변경하십시오.

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

정말 감사합니다. 그러나 비교는 왜 할당이 공백을 사용하지 않는지 궁금합니다.
Shubhanshu Mishra

5
^^ 구문입니다. 명령 줄의 첫 번째 단어는 명령이고 다음 단어는 인수입니다. var=value [command [args]]변수에 값이 할당되는 구문입니다. 비교를 위해 [( /usr/bin/[)는 명령이며 var1,! = & var2는 3 개의 개별 인수가 필요합니다. var1! = var2는 단일 인수입니다.
anishsane 2011

62

쉘에서 빈 문자열을 확인하기 위해

if [ "$str" == "" ];then
   echo NULL
fi

또는

if [ ! "$str" ];then
   echo NULL
fi

9
쉘의 문자열 같음 연산자는 =입니다. 은 ==젊은 프로그래머의 마음까지 엉망 쉘 저자에 의해 발명이 아닌 휴대용 해킹입니다.
Jens

17

단일 공백이 아닌 임의의 공백을 확인해야하는 경우 다음을 수행 할 수 있습니다.

여분의 공백 문자열을 제거하려면 (중간 공백을 하나의 공백으로 간주) :

trimmed=`echo -- $original`

는 에코로 인식되는 스위치 --$original포함되어 있는 경우 에도 여전히 에코 될 일반 인수로 간주됩니다. 또한 ""주위 $original에 두지 않는 것이 중요합니다. 그렇지 않으면 공백이 제거되지 않습니다.

그 후에 $trimmed비어 있는지 확인할 수 있습니다 .

[ -z "$trimmed" ] && echo "empty!"

3
bourne shell에서는 trimmed 값으로 "-"로 끝납니다.
Sridhar Sarnobat

이 게시물 에 따르면 echo는 옵션의 끝을 의미하는 해석이 아닙니다. 내 Bash 셸에서 Sridhar Sarnobat
Mr.C

9

문자열에 공백이 아닌 무언가가 있는지에 대한 또 다른 빠른 테스트입니다.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n"은 길이가 0이 아닌 문자열을 의미합니다.

그런 다음 처음 두 개의 슬래시 는 우리의 경우 공백에서 다음 모두 와 일치 함을 의미 합니다. 그런 다음 세 번째 슬래시 다음에 대체 (빈) 문자열이 나오고 "}"로 닫힙니다. 일반적인 정규식 구문과의 차이점에 유의하십시오.

여기에서 bash 쉘 스크립팅의 문자열 조작에 대해 자세히 읽을 수 있습니다 .


아닌 [[ -n "$1" ]]같은 [[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills 당신이 맞습니다. -n을 사용하면 조금 더 짧아집니다. 그에 따라 답변을 업데이트했습니다.
elomage

6

문자열이 비어 있거나 공백 만 포함되어 있는지 확인하려면 다음을 사용할 수 있습니다.

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

Bash 매뉴얼의 쉘 매개 변수 확장패턴 매칭 을 참조하십시오 .


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

문자열에서 모든 줄 바꿈과 공백을 제거하면 빈 줄이 테스트되고 실행될 수있는 것으로 축소됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.