[linux] bash의 정수 비교, 단항 연산자 예상

다음 코드는

[: -ge : 단항 연산자 예상

언제

i=0

if [ $i -ge 2 ]
then
    #some code
fi

왜?



답변

$i문이 실패하면 값이 공백 이라는 사실 때문에 문제가 발생 합니다. 다음 중 하나가 비어있을 가능성이 가장 적은 경우 비교를 수행 할 때 항상 변수를 인용 하십시오.

if [ "$i" -ge 2 ] ; then
  ...
fi

쉘이 변수를 처리하는 방식 때문입니다. 원래 예를 가정 해 봅시다.

if [ $i -ge 2 ] ; then ...

특정 코드 줄을 실행할 때 쉘이 가장 먼저하는 일은 $i즐겨 찾는 편집기의 검색 및 바꾸기 기능 과 마찬가지로 값을 대체 하는 것입니다. 따라서 $i비어 있거나 훨씬 더 예시적인 $i공간 이라고 가정 하십시오! 쉘은 $i다음과 같이 교체 됩니다.

if [     -ge 2 ] ; then ...

변수 대체가 완료되면 쉘은 비교를 진행하고 ….는 왼쪽 에 이해할 수있는 것을 볼 수 없으므로 실패합니다 -gt. 그러나 인용 $i:

if [ "$i" -ge 2 ] ; then ...

된다 :

if [ "    " -ge 2 ] ; then ...

쉘은 이제 큰 따옴표를보고 실제로 네 개의 공백을 2와 비교하고를 생략한다는 것을 알고 있습니다 if.

다음과 같이 $iif에 기본값을 지정하는 옵션도 있습니다 $i.

if [ "${i:-0}" -ge 2 ] ; then ...

이 값이 0이 아닌 대체 할 $i되어 $i미정된다. 다시 $i많은 공백이 있으면 undefined로 계산되지 않고 0으로 대체되지 않고 다시 한 번 문제가 발생 하기 때문에 따옴표를 계속 유지 합니다.

시간 있으면 이것을 읽으십시오 . 쉘은 많은 사람들에 의해 블랙 박스처럼 취급되지만 매우 적은 규칙으로 작동합니다. 일단 규칙이 무엇인지 알고 있으면 (위에서 설명한 것처럼 쉘에서 변수가 작동하는 방식 중 하나입니다) 쉘은 더 이상 비밀이 없습니다.


답변

오류 메시지에서 판단 할 때 i 값은 0이 아닌 빈 문자열이었습니다.


답변

5 센트를 추가해야합니다. 나는 모두 사용을 참조 [하거나 [[,하지만 그것은 가치가 구문에 포함되지 않은 것을 언급.

산술 비교를 위해 ((...))대신 사용하십시오.

((…))은 산술 명령으로, 표현식이 0이 아닌 경우 종료 상태 0을, 표현식이 0 인 경우 1을 리턴합니다. 부작용 (할당)이 필요한 경우 “let”의 동의어로도 사용됩니다.

참조 : 산술 표현


답변

당신의 스크립트 조각은 훌륭하게 작동합니다. “i”에 if 전에 다른 것을 할당하지 않습니까?

일반적인 실수는 대괄호 뒤와 앞에 공백을 두지 않는 것입니다.


답변