테스트 문에서 bash의 문자열과 숫자 비교?

테스트 문에서 bash의 문자열과 숫자 비교?

내가 하고 있는 이 비교에 대해 잘 모르겠습니다.

   if [ "$exit_status" -eq 0 ];then
   #some statements
   fi

숫자나 따옴표를 비교하는 올바른 방법은 변수를 exit_status0과 비교할 문자열로 만드는 것입니다. 일부 시나리오에서는 이것이 실패할 수 있는지 모르겠습니다.

답변1

예, 맞습니다.

쉘의 따옴표는 다른 언어와 다른 목적으로 사용됩니다. 보다이 답변상세 사항은.

셸에서 따옴표는 셸이 일부 문자를 특별하게 처리하는 것을 방지하고 셸이 일부 확장 유형(이 경우 변수 확장과 같은)에서 수행하는 일부 작업을 방지하는 데 사용됩니다.

일반적으로 이 경우 해당 변수의 내용인 명령 "$exit_status"에 대한 하나의 인수로 확장하려고 하므로 [따옴표가 필요합니다.

답변2

[ "$exit_status" -eq 0 ]$exit_status에 숫자만 포함되어 있으면 정확하며 따옴표를 제거할 수도 있습니다(IFS에 숫자가 포함되어 있지 않은 경우).

x가 비어 있거나 설정되지 않은 경우 [ "$x" -eq 6 ]오류가 발생하지만 다음과 같은 결과 [[ "$x" -eq 6 ]]는 발생하지 않습니다.

$ x=; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ unset x; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ x=; [[ "$x" -eq 6 ]]
$ unset x; [[ "$x" -eq 6 ]]
$ 

산술 연산자는 공백을 제거합니다.

$ [ '6 ' -eq $'\n\t6' ]; echo $?
0

[[ 내부에서 산술 연산자의 피연산자는 산술 표현식이므로 예를 들어 [[ 4 -eq 2+2 ]]true입니다. 0으로 시작하는 숫자는 8진수로 처리됩니다.

$ [[ 010 -eq 8 ]]; echo $?
0
$ [ 010 -eq 8 ]; echo $?
1

나는 정수를 비교할 때에도 = / ==를 자주 사용합니다. = 및 ==는 [[ 및 [ 내부의 bash에서 동일합니다. == 및 [[는 POSIX에 의해 정의되지 않습니다.

단어 분할 및 경로명 확장은 [[ 내부에서 수행되지 않습니다. [[ $x = $y ]]y를 패턴으로 처리하지만 [[ $x = "$y" ]]y를 문자 그대로 처리합니다.

$ x=44; y='4*'
$ [[ $x = $y ]]; echo $?
0
$ [[ $x = "$y" ]]; echo $?
1

답변3

하지만 숫자를 인용하는 것은 거의 쓸모가 없습니다. 매개변수 값이 숫자이면 따옴표는 아무 것도 변경하지 않으며, 그렇지 않은 경우 어쨌든 if는 실패합니다. 좋습니다. 모든 경우에 해당되는 것은 아닙니다.

exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false
exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true

이는 bash 내장 기능 때문 [이지만 그럼에도 불구하고 간단한 명령인 반면 [[명령줄 구문 분석을 변경하는 복합 명령입니다.

관련 정보