检查变量是否是小于给定数字或等于文本“QUIT”的数字

检查变量是否是小于给定数字或等于文本“QUIT”的数字

只要 $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

相关内容