如何检查一个数字是否超出了bash的动态范围?

How to check if a number is outside a dynamic range in bash?

提问人:Pashunel 提问时间:6/18/2023 更新时间:6/18/2023 访问量:58

问:

我有一个披萨生成器代码。它允许用户从侧面文件中选择比萨饼尺寸和配料列表。 我正在尝试验证用户输入,以便它可以输入一个介于 1 和侧面文件中浇头数量之间的数字。

我从文件中获取行数并使用 wc 将其设置为变量numtop=$( cat Toppings | wc -l );

之后,我读取了用户输入并使用 if 运行检查

read topp
if [[ "$topp" < 1 || "$topp" > "$numtop" ]]; then
     echo "Enter from 1 to " $numtop
else
     echo "Good choice"
fi

但它只允许我输入 1 或$numtop变量中的数字。我不明白为什么这不起作用。

bash shell if-statement 变量

评论

0赞 jhnc 6/18/2023
<并比较字符串。将 OR 用于数字>-gt-lt
0赞 jhnc 6/18/2023
并在检查值是否在范围内之前对非数字进行测试

答:

1赞 Jetchisel 6/18/2023 #1

您需要使用 for 算术表达式,如下所示:(( ))

#!/usr/bin/env bash

numtop="$(wc -l < Toppings)"

while read -rp "Enter from 1 to  $numtop " topp; do
  if (( topp < 1 || topp > numtop )); then
    echo "Enter from 1 to $numtop"
  else
    echo "Good choice"
    break
  fi
done

编辑:根据 ,给定输入是这样的:(第一个答案严重中断)如果输入是严格的数字,请先检查输入的值。@jhnca[$(date>/dev/tty)],1

#!/usr/bin/env bash

##: Test also if Toppings is empty if it is a file
##: or just test the value of $numtop.
numtop="$(wc -l < Toppings)"

while printf 'Enter from 1 to %s ' "$numtop"; do
  read -r topp
  case $topp in
    ('')
      printf 'input is empty\n' >&2
       ;;
    (*[!0123456789]*)
       printf '%s has a non-digit somewhere in it\n' "$topp" >&2
       ;;
    (*)
      if (( topp < 1 || topp > numtop )); then
        printf 'You entered %s\n' "$topp"  >&2
      else
        printf 'You entered %s Good choice!\n' "$topp" &&
        break
      fi
     ;;
  esac
done

  • 当 中使用 时,和不用于 bash 中的算术表达式,请参见。它用于测试字符串词典<>[[ ... ]]help test

  • 请参阅在线 bash 手册中的条件构造,并查找 ,其中指出:[[ expression ]]When used with [[, the ‘<’ and ‘>’ operators sort lexicographically using the current locale.

  • 请参阅如何判断变量是否包含有效数字?

  • numtop=$( cat Toppings | wc -l );UUOC 的一种形式

评论

2赞 jhnc 6/18/2023
您应该先检查非数字。考虑用户是否输入:a[$(date>/dev/tty)],1