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


답변:


295

$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으로 대체되지 않고 다시 한 번 문제가 발생 하기 때문에 따옴표를 계속 유지 합니다.

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


7
따옴표로 묶는 변수는 정수 표현식
Néstor

@ Néstor wrong , 변수를 인용 하면 변수가 숫자 인 경우 예상되는 정수 식과 같은 새로운 오류가 발생하지 않습니다 . 숫자 이외의 변수 값을 제공 인용 여부, 것이다 상기 오류 발생.
vladr

6

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


6

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

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

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

참조 : 산술 표현


2

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.