只要 $CHOICE 不是“QUIT”或小于给定整数(变量)的数字,我就会留在这个循环中。
我正在使用这个:(以 22 为例)
NUMBER=22
CHOICE=99
while [ "$CHOICE" -gt "$NUMBER" ] && [ "$CHOICE" != "QUIT" ]; do
read CHOICE < /dev/tty
done
但是,如果我输入“测试”,脚本就会崩溃,因为它在第一个测试中需要一个整数。
我该怎么做才能避免这次崩溃?
答案1
当 CHOICE 不是“QUIT”或小于 NUMBER 的整数时,以下代码将循环:
NUMBER=22
while :; do
read CHOICE
case $CHOICE in
QUIT) break;;
*[!0-9]*|'') ;;
*) test "$CHOICE" -lt "$NUMBER" && break;;
esac
done
如果您还希望在用户输入 ^D 时退出循环,则应将 设为read
循环条件:while read CHOICE; do case $CHOICE ...
。
答案2
调整莫斯维的回答:
NUMBER=22
while read CHOICE ; do
case "${CHOICE}" in
QUIT) break ;;
*[!0-9]*) ;;
?*) [ "${CHOICE}" -lt $NUMBER ] && break ;;
esac
done
- 不要放入
read
循环中。 - 无需初始化
$CHOICE
,并且 - 改为
*)
,?*)
减少条件 -莫斯维的|''
可能会掉下来。
答案3
您可能需要对字母字符进行额外的测试,例如
while [ "$CHOICE" != "QUIT" ] && { [ "${CHOICE//[[:alpha:]]}" != "$CHOICE" ] || [ "$CHOICE" -gt 10 ]; }
do read CHOICE < /dev/tty
done