输入无效字符时验证没有语法错误的数字范围
Validating a numeric range without syntax errors when invalid characters are entered
您好,我在 bash 脚本上有一个菜单。用户必须输入 1 到 5 之间的数字。这是我的代码:
read -r data
while [[ ${data} -lt 1 ]] || [[ ${data} -gt 5 ]]; do
echo "You must enter a number between 1 and 5"
read -r data
done
乍一看工作正常,但如果用户输入“*”或“/”(可能还有其他特殊字符),就会出现问题。由于句法错误,他们破坏了脚本。我猜这是 "some kind of injection".
我该如何避免这种情况 "breaking inputs" 并将我的数据保持为 1 到 5 之间的数字?也许正则表达式和这个的组合?如何?谢谢。
EDIT 案例的使用对我无效。对于最小的示例,我放置了静态数字,但实际情况是 1 和 5 是动态数字,因此无法使用静态大小写来完成。
只需添加一个数字条件检查:[[ $data =~ ^[[:digit:]]+$ ]]
read -r data
while [[ ! $data =~ ^[[:digit:]]+$ ]] || (( data < 1 || data > 5 )); do
echo "You must enter a number between 1 and 5"
read -r data
done
您可以使用否定检查,甚至可以将其放在控制 while 循环的表达式中。它可以足够短,成为一条线。
while { read -r -p "Enter a number, 1 to 5. " n && [[ $n = [[:digit:]] ]]; } && (( n < 1 || n > 5 )); do :; done
或者为了便于阅读:
while {
read -r -p "Enter a number, 1 to 5. " n && [[ $n = [[:digit:]] ]]
} &&
(( n < 1 || n > 5 )); do
: Nothing to do here.
done
这有哪些重要的部分?
- 花括号定义了一个逻辑表达式,供
while
评估。如果该表达式中的所有内容都计算为真,则继续下一个算术测试。
:
是空操作。在 while 循环中实际上不需要 运行,您只需要继续循环直到 $n
正确计算。
- 如果双括号中的算术表达式的计算结果为假,则循环结束,
n
的值设置为您期望的值。 $n
的非数字值在这种表达式中应计算为零。
您好,我在 bash 脚本上有一个菜单。用户必须输入 1 到 5 之间的数字。这是我的代码:
read -r data
while [[ ${data} -lt 1 ]] || [[ ${data} -gt 5 ]]; do
echo "You must enter a number between 1 and 5"
read -r data
done
乍一看工作正常,但如果用户输入“*”或“/”(可能还有其他特殊字符),就会出现问题。由于句法错误,他们破坏了脚本。我猜这是 "some kind of injection".
我该如何避免这种情况 "breaking inputs" 并将我的数据保持为 1 到 5 之间的数字?也许正则表达式和这个的组合?如何?谢谢。
EDIT 案例的使用对我无效。对于最小的示例,我放置了静态数字,但实际情况是 1 和 5 是动态数字,因此无法使用静态大小写来完成。
只需添加一个数字条件检查:[[ $data =~ ^[[:digit:]]+$ ]]
read -r data
while [[ ! $data =~ ^[[:digit:]]+$ ]] || (( data < 1 || data > 5 )); do
echo "You must enter a number between 1 and 5"
read -r data
done
您可以使用否定检查,甚至可以将其放在控制 while 循环的表达式中。它可以足够短,成为一条线。
while { read -r -p "Enter a number, 1 to 5. " n && [[ $n = [[:digit:]] ]]; } && (( n < 1 || n > 5 )); do :; done
或者为了便于阅读:
while {
read -r -p "Enter a number, 1 to 5. " n && [[ $n = [[:digit:]] ]]
} &&
(( n < 1 || n > 5 )); do
: Nothing to do here.
done
这有哪些重要的部分?
- 花括号定义了一个逻辑表达式,供
while
评估。如果该表达式中的所有内容都计算为真,则继续下一个算术测试。 :
是空操作。在 while 循环中实际上不需要 运行,您只需要继续循环直到$n
正确计算。- 如果双括号中的算术表达式的计算结果为假,则循环结束,
n
的值设置为您期望的值。$n
的非数字值在这种表达式中应计算为零。