다음 코드는
[: -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 전에 다른 것을 할당하지 않습니까?
일반적인 실수는 대괄호 뒤와 앞에 공백을 두지 않는 것입니다.
답변
