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
.
다음과 같이 $i
if에 대한 기본값을 $i
비워 둘 수있는 옵션도 있습니다 .
if [ "${i:-0}" -ge 2 ] ; then ...
이 값이 0이 아닌 대체 할 $i
되어 $i
미정된다. 다시 $i
많은 공백이 있으면 undefined로 계산되지 않고 0으로 대체되지 않으므로 다시 한 번 문제가 발생 하기 때문에 따옴표를 계속 유지 합니다.
시간 이 있으면 이것을 읽으십시오 . 쉘은 많은 사람들에 의해 블랙 박스처럼 취급되지만, 아주 적은 규칙으로 작동합니다. 일단 규칙이 무엇인지 알고 있으면 (위에서 설명한 것처럼 쉘에서 변수가 작동하는 방식 중 하나입니다) 쉘은 더 이상 비밀이 없습니다.
오류 메시지에서 판단 할 때 i 값은 0이 아닌 빈 문자열이었습니다.
5 센트를 추가해야합니다. 나는 모두 사용을 참조 [
하거나 [[
,하지만 그것은 가치가 구문에 포함되지 않은 것을 언급.
산술 비교를 위해 ((...))
대신 사용하십시오.
((...))은 산술 명령으로, 표현식이 0이 아닌 경우 종료 상태 0을, 표현식이 0 인 경우 1을 리턴합니다. 부작용 (할당)이 필요한 경우 "let"의 동의어로도 사용됩니다.
참조 : 산술 표현
당신의 스크립트 조각은 훌륭하게 작동합니다. "i"에 if 앞에 다른 것을 할당하지 않습니까?
일반적인 실수는 대괄호 뒤와 앞에 공백을 두지 않는 것입니다.
참고 URL : https://stackoverflow.com/questions/408975/compare-integer-in-bash-unary-operator-expected
'Programing' 카테고리의 다른 글
정렬 뒤의 구문 (key = lambda :…) (0) | 2020.06.26 |
---|---|
Bootstrap 3의 탐색 표시 줄에 아이콘이있는 검색 상자를 추가하는 방법은 무엇입니까? (0) | 2020.06.26 |
ASP.NET :이 메서드는 응용 프로그램의 사전 시작 초기화 단계에서 호출 할 수 없습니다 (0) | 2020.06.26 |
C ++ cout 16 진수 값? (0) | 2020.06.26 |
특정 Java 버전을 Maven으로 설정하는 방법 (0) | 2020.06.26 |