sh 쉘을 사용하여 문자열 비교


197

SH 셸을 사용하고 있으며 문자열을 변수 값과 비교하려고하지만 if조건은 항상 true로 실행됩니다. 왜?

다음은 몇 가지 코드입니다.

Sourcesystem="ABC"

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

이것은 작동하지 않습니다.

Sourcesystem="ABC"

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

둘째, 이것을 NULL 또는 빈 문자열과 일치시킬 수 있습니까?


먼저 Bourne 쉘에서는 추가 ';'가 필요하지 않습니다. Bourne 셸에서 스크립트를 테스트 할 때 if 조건은 false입니다. 먼저 경고를 표시합니다. [: ABC : 정수 표현식이 필요합니다. 출력은 "Sourcesystem is NOT Matched ABC"입니다. 다른 사람들이 언급했듯이 -eq는 정수 비교에 사용됩니다. Bourne 쉘 (#! / bin / sh)에서 문자열 비교를 위해 단일 등호를 사용하십시오. 당신의 쉘은 처음에 당신을 수정했을 것입니다.
Kemin Zhou

6
재 개설 투표. 인용 된 dups는 때때로 Posix 쉘 또는 Dash 인 빈약 한 sh 쉘이 아닌 bash 쉘용입니다.
jww

1
동의하고 투표했습니다. shbash같은 관계를 맺을 C하고 C++. 첫 번째를 위해 작성된 코드가 두 번째에서 유효하더라도 두 번째에 대한 답변은 첫 번째에서 작동한다고 신뢰할 수 없습니다.
btilly

답변:


290

=문자열 비교 에는 연산자를 사용해야합니다 .

Sourcesystem="ABC"

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

man test-z빈 문자열과 일치 하는 데 사용한다고 말합니다 .


2
ABC또는 을 인용 할 필요가 없습니다 XYZ.

29
변수에 공백이있을 수 있으면 따옴표가 필요합니다.
William Everett

1
@WilliamEverett에서 해당 부분을 더 명확하게 만들기 위해 예제를 조정했습니다.
당 룬드 버그


36

eq는 정수를 비교하는 데 사용되며 대신 '='를 사용합니다. 예 :

if [ 'AAA' = 'ABC' ];
then 
    echo "the same" 
else 
    echo "not the same"
fi

행운을 빕니다


참고 : 변수를 비교하는 경우 "$VAR"단순히 사용하는 것이 아니라 사용하십시오$VAR
Sridhar

22

나는 똑같은 문제가 있었다.

if [ 'xyz' = 'abc' ];
then
echo "match"
fi

공백을 확인하십시오. 이 경우 공백을 사용하는 것이 중요합니다.= 부호 .

" 기타 비교 연산자 "를 확인하십시오 .


1
Dockerfile : / bin / sh : 1 : [: = : 예기치 않은 연산자
holms

10

-eq정수를 비교하기위한 쉘 비교 연산자입니다. 문자열을 비교하려면 =.


5

-eq수학적 비교 연산자입니다. 나는에 의존, 문자열 비교를 위해 그것을 사용한 적이 ==!=비교하십시오.

if [ 'XYZ' == 'ABC' ]; then   # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both
  echo "Match"
else
  echo "No Match"
fi

18
연산자 ==는 모든 셸 에서 작동 하지 않습니다. =문자열을 비교하는 데 사용할 수있는 올바른 연산자 ==이며 때로는 동의어입니다.
Omer Dagan 2015 년

3

내가 테스트 한 4 개의 셸 중 및 ABC -eq XYZ에 대한 test기본 제공 에서 true로 평가됩니다 . 표현은 거짓 아래로 평가 과의 내장 명령 과 . 으로 하고 , 문자열을 수치로 변환 및 IMO가 모두 0이기 때문에이다위한 내장 매크로의 동작과 동일 하고 정확하지만 대한 사양은 이것에 모호한. zshksh/usr/bin/testdashbashkshzshkshzshtest


1
테스트 해 주셔서 감사합니다. 이것이 Bourne 쉘이 인기있는 이유입니다.
Kemin Zhou

zsh는 다음을 명확하게 출력합니다 . [ 또는 내장 테스트를 사용한 후 예상되는 정수 표현식 . 문자열이 중요한 정수 가 아니기 때문에 둘 다 0으로 평가하는 [[] 를 강제하고있을 수 있습니다 .
code933k

@ code933k 어떤 버전입니까? 행동이 바뀌어도 놀라지 않을 것입니다.
William Pursell 19

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