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