일부 요소가 포함된 배열이 있고 일부 함수에는 다음이 있습니다.
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
블록이 실행되고d
if
아니요예상되는.
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 ]]
첫 번째 부분이 실패하므로 두 번째(잘못된) 표현식을 건너뜁니다.
고려할 수 있는 몇 가지 솔루션이 있습니다.
[[ … ]]
오래되었지만 허용되는 것을 사용하는 대신[ … ]
. 이는 이중 확장을 수행하지 않습니다. 그러나 이는 숫자가 아닌 경우 "숫자 아님" 오류를 포착하지 못하므로$option
여전히 오류가 발생합니다.[ "$option" -ge 1 ] && [ "$option" -le ${#array[@]} ]
문자열의 문자가 숫자인지 확인하여 식 비교를 보호합니다.
[[ "$option" =~ ^(0|([1-9][0-9]*))$ && "$option" -ge 1 && "$option" -le "${#array[@]}" ]]