테스트 구조의 비교 종료 상태

테스트 구조의 비교 종료 상태

나는 "if then" 진술을 작성하고 있는데 그것이 이상한 행동인 것 같다는 것을 발견했습니다. 조사한 후에 이것이 내가 하고 있던 비교의 종료 코드에 해당한다는 것을 깨달았습니다. 아래 코드 조각에서 제가 찾은 내용을 설명합니다.

보시다시피

rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"

산출

es_num is 1
es_str is 0

-eq종료 상태 와 테스트 구성의 내부 차이점을 논의하는 문서(가급적 POSIX 표준)가 있습니까 ?=

조건문을 작성할 때 주의할 점은 무엇인가요? 이에 대한 모범 사례는 무엇입니까?

이식 가능한 코드는 Bash 코드(내가 사용하는 코드)보다 선호됩니다.

답변1

-eq

정수 n1과 n2가 대수적으로 같으면 참이고, 그렇지 않으면 거짓입니다.

시험

=

문자열 s1과 s2가 동일하면 참이고, 그렇지 않으면 거짓입니다.

시험

따라서 -eq정수를 비교하고 =문자열을 비교하십시오(이는 일부 제한된 정수 사례에도 적용됩니다).


하지만 구문 문제가 있습니다. 다음과 같아야 합니다.

[ "$rc" = 0 ]

설마

[ $rc=0 ]

[ "$rc" = 0 ] ~해야 한다rc0이 아니므로 1로 종료됩니다.

[ $rc=0 ]문자열로 처리될 수 있고 [테스트 구성에 문자열이 있으면 true로 평가되므로 실제로는 0으로 종료되어야 합니다.


sh [테스트에는 몇 가지 차이점이 있습니다.

# leading 0
$ [ 01 -eq 1 ]; echo $?
0
# adjacent whitespace
$ [ ' 1' -eq 1 ]; echo $?
0
# negative 0 vs positive 0
$ [ 0 -eq -0 ]; echo $?
0

그러나 [[bash로 테스트해 보면 (위에서 언급한 것 포함) 많은 차이점이 있습니다.

# base 8
$ [[ 032 -eq 26 ]]; echo $?
0
# Arithmetic expressions
$ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
0
# Base 64
$ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
0

답변2

-eq숫자 비교의 경우 문자열 비교를 위해 while을 사용해야 합니다 =(변수 이름 지정을 이미 알고 있는 것 같습니다).

내가 아는 aka 명령에 대한 가장 좋은 소개 중 하나 test는 다음과 같습니다.[유닉스 쉘의 겸손한 if

관련 정보