整数输入约束

整数输入约束

我想对以下内容进行输入约束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读取输入,而不是 shell,但您也可以执行此操作read,然后过滤结果。echo error您可以在循环中使用表达式(重新提示用户输入另一个输入),或者直接使用 来代替exit 1

答案2

你不能这样做 read x- 你还没有读过它。如何测试未知的事物?唯一的解决方案是获取数据,然后进行测试。然而,这是可以做到的:

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

相关内容