정수 입력 제약

정수 입력 제약

다음에 대한 입력 제약 조건을 만들고 싶습니다 read.

터미널 쉘;

read x
read y
echo $(($x+$y))

나는 제약이 되고 x싶다 . 앞서 삽입한 명령은 무엇이었나요 ?x-100 <= x <= 100
read x

답변1

$x문자열입니다. 사용자는 숫자를 입력할 필요는 없지만 무엇이든 입력할 수 있습니다. 입력 유효성 검사가 진행 중입니다.뒤쪽에입력하다. 산술 비교를 하기 전에 정수인지 확인해야 합니다. 예를 들어

read x
#validate if it is an integer
[[ "$x" =~ -?[0-9]+ ]] || echo error
#validate range (this is better done algebraically, not with string manipulation)
(( x >= -100 && x <= 100 )) || echo error
# carry on

그런데 의 산술 평가식에서는 $(( ... ))변수 확장 대신 변수 이름을 사용할 수 있습니다. 그냥 써 $(( x + y )).


청교도 솔루션:

x=$(awk '/^-?[0-9]+\s*$/{ if ($1<=100 && $1>=-100){ print; exit; } } { exit 1; }') || echo error

이 경우 awk셸이 아닌 입력을 읽지만 이를 수행 read한 다음 결과를 필터링할 수도 있습니다. echo error루프에서 표현식을 사용하거나(사용자에게 다른 입력을 다시 요청) 대신 직접 사용할 수 있습니다 exit 1.

답변2

당신은 이것을 할 수 없습니다앞으로 read x- 아직 안 읽어보셨군요. 알려지지 않은 것을 테스트하는 방법은 무엇입니까? 유일한 해결책은 데이터를 얻은 다음 테스트하는 것입니다. 그러나 다음과 같이 할 수 있습니다.

case ${#x}${x##?*[!0-9]*} in 
(?|[!1-4]*|4[!-]*|1-*|?[!-0-9]*) ! :;;
(*) echo "$(( x + y ))";;esac

관련 정보