다음에 대한 입력 제약 조건을 만들고 싶습니다 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