提问人:Pashunel 提问时间:6/18/2023 更新时间:6/18/2023 访问量:58
如何检查一个数字是否超出了bash的动态范围?
How to check if a number is outside a dynamic range in bash?
问:
我有一个披萨生成器代码。它允许用户从侧面文件中选择比萨饼尺寸和配料列表。 我正在尝试验证用户输入,以便它可以输入一个介于 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变量中的数字。我不明白为什么这不起作用。
答:
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
编辑:根据 ,给定输入是这样的:(第一个答案严重中断)如果输入是严格的数字,请先检查输入的值。@jhnc
a[$(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
评论
<
并比较字符串。将 OR 用于数字>
-gt
-lt