SH, 평등은 이루어질 수 없다

SH, 평등은 이루어질 수 없다

간단한 if 문을 작동시키려고 합니다.

if [ $sip1 = 0 ] ; then do stuff ; fi

내 하위라인에는 sh내가 겪고 있는 어려움이 표시됩니다.

정수로 저장하고 있는 0을 인식할 수 없습니다. 문자열과 비교하면 일치하지 않는다고 나옵니다.

# if [ `expr $sip1` ] ; then echo hi
> fi
hi
# if [ `expr $sip1 = 1` ] ; then echo hi; fi
hi
# if [ `expr $sip1 = 2` ] ; then echo hi; fi
hi
# expr $sip1
0
# if [ `expr $sip1 + 0 = 2` ] ; echo hi
>
# if [ `expr $sip1 + 0 = 2` ] ; then echo hi
> fi
expr: non-numeric argument
# echo $sip1
0
# if [ $sip1 = "0" ] ; then echo hi ; fi
# if [ $sip1 = '0' ] ; then echo hi ; fi
# echo ">$sip1<"
<0

답변1

귀하 가 게시한 내용 echo:

# echo ">$sip1<"
<0

예상할 수 있듯이 표시기 변수의 값 뒤에는 캐리지 리턴 문자( Bash 구문) 가 sip1오지 않습니다 .00$'0\r'

$ zero_cr=$'0\r'
$ if [ "$zero_cr" = "0" ] ; then echo hi ; fi
$ zero='0'
$ if [ "$zero" = "0" ] ; then echo hi ; fi
hi
## Or, using the proper numeric equality operator:
$ if [ "$zero" -eq "0" ] ; then echo hi ; fi
hi

변수를 채우는 방법에 따라 변수에서 캐리지 리턴을 제거하는 것이 좋습니다.

  • sip1=$(command...)코드가 다음 과 같으면 sip1=$(command... | tr -d '\r')잘못된 캐리지 리턴이 제거되고 테스트가 성공해야 합니다.

  • 또는 Bash를 가정하면 후행 캐리지 리턴을 제거하는 것은 구문을 사용하여 작동하는 것으로 보이 ${foo%$'\r'}므로 sip1=${sip1%$'\r'}변수에서 후행 캐리지 리턴을 지워야 합니다.

관련 정보