Linux 쉘 스크립트: if 문의 입력 문자를 계산하지만 예상한 것과는 다릅니다.

Linux 쉘 스크립트: if 문의 입력 문자를 계산하지만 예상한 것과는 다릅니다.

일부 요소가 포함된 배열이 있고 일부 함수에는 다음이 있습니다.

echo -n "Select the option: "
read option

echo "option: '${option}'"
echo "option: '$option'"

if [[ $option -ge 1 && option -le ${#array[@]} ]]; then
 echo "go go go"
 ...
else
 ...
fi

입력과 관련하여 기록된 숫자가 배열의 길이/크기보다 큰 경우 블록은 else예상대로 수행됩니다(음수와 동일) 0. 여기까지는 모든 것이 예상된다

그러나 와 같이 간단한 문자를 쓰면 s블록이 실행되고dif아니요예상되는.

select the option: d
option: 'd'
option: 'd'
go go go

내 이해에 따르면 숫자에 적용 -ge됩니다 -le. 따라서 문자를 사용하여 숫자 비교를 수행하는 경우 실패해야 합니다. else블록 으로 직접 이동해야 합니다.

이 문제를 어떻게 해결하나요?

답변1

여기서 무슨 일이 일어나고 있는지는 (당신에게) 예상치 못한 코멘트입니다. 참고로 원래 표현은 다음과 같습니다.

[[ $option -ge 1 && option -le ${#array[@]} ]]

먼저 $option재고를 확보하십시오. 이 경우에는 입니다 d. 그런 다음 이를 [[ … ]]표현식에 연결하여 다음을 얻습니다.

[[ d -ge 1 && option -le 12 ]]

이는 평가적입니다. 그러나 [[ … ]]사용된 표현식은 변수 이름으로 bash평가되고 d처리 option되므로 또 다른 수준의 확장이 있습니다(암시적으로 this 를 인식함 d=0).

[[ 0 -gt 1 && d -le 12 ]]

첫 번째 부분이 실패하므로 두 번째(잘못된) 표현식을 건너뜁니다.

고려할 수 있는 몇 가지 솔루션이 있습니다.

  1. [[ … ]]오래되었지만 허용되는 것을 사용하는 대신 [ … ]. 이는 이중 확장을 수행하지 않습니다. 그러나 이는 숫자가 아닌 경우 "숫자 아님" 오류를 포착하지 못하므로 $option여전히 오류가 발생합니다.

    [ "$option" -ge 1 ] && [ "$option" -le ${#array[@]} ]
    
  2. 문자열의 문자가 숫자인지 확인하여 식 비교를 보호합니다.

    [[ "$option" =~ ^(0|([1-9][0-9]*))$ && "$option" -ge 1 && "$option" -le "${#array[@]}" ]]
    

관련 정보