2012-11-22 4 views
45

문자열이 공백이 아니거나 비어 있지 않은지 확인해야하는 다음 쉘 스크립트를 실행하려고합니다. 그러나, 나는 언급 한 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 

답변

76

!=의 양쪽에 공백이 있어야합니다. 에 코드를 변경합니다

shopt -s extglob # more powerful pattern matching 

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

는 배쉬 설명서에 Shell Parameter ExpansionPattern Matching를 참조하십시오 : 문자열이 비어 있거나 당신이 사용할 수있는 공백 만 포함되어있는 경우

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 
+0

고마워. 작동한다. 그러나 비교가하는 반면 할당이 공간을 사용하지 않는 이유가 궁금합니다. –

+5

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

+0

@anishsane 세부 사항을 고맙게 생각합니다. 지금 받으십시오. =) –

40

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

또는

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

쉘의 문자열 항등 연산자 작용 될 수있다 아무것도로 감소하는 것은'='이다. '=='는 셸 작성자가 젊은 프로그래머들의 마음을 망쳐 놓도록 고안된 비 휴대용 해킹입니다. – Jens

6

확인하십시오.

+1

학습 목적으로이 부분을 설명해 주시겠습니까? 이것은 횡설수설처럼 보입니다 ^^; 이거 grep 같은 거니? –

+1

@Keith M : 게시물에 제공 한 문서에 대한 링크를 확인하십시오. –

11

이 경우 당신이 공백의 양에 대해 확인할 필요가 아닌 하나의 공간, 당신은이 작업을 수행 할 수 있습니다

추가 공백의 문자열을 제거하기 위해 (하나의 공간에 중간에 공백을 condences) :

trimmed=`echo -- $original` 

-- $original는 에코 이해할 스위치를 포함하는 경우 정상 인자 반향로서, 그들은 여전히 ​​고려되도록 것이다. 또한 ""$original에 두지 않는 것이 중요합니다. 그렇지 않으면 공백이 제거되지 않습니다.

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

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

bourne shell에서는 트림 된 값으로 "-"로 끝납니다. –

2

문자열이 있지만 공간이 있어야한다는 또 다른 빠른 테스트.

빈 하나의 원인이됩니다 문자열의 모든 줄 바꿈과 공백을 스트리핑
if [[ ! -z "${str/ //}" ]]; then 
    echo "It is not empty!" 
fi 
1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty" 

이 테스트

관련 문제