나는 "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 ]
~해야 한다rc
0이 아니므로 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