我想对以下内容进行输入约束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