我一直在努力解决这个问题,但我知道这可能非常简单,所以希望一副新眼睛可以提供帮助。我有一个Bourne shell(sh)脚本,我正在写它,它需要一个整数列表作为输入(从1整数的数量,理想情况下,我想采取正负的整数)。如果有人输入的不是整数,我正试图对这种情况进行错误检查。他们可以输入“1 2 3 4 5 a”并且它会给出错误,因为a不是int。
我有一个错误检查,没有输入有效,而且我的代码会对整数列表本身进行处理,但即使给出了字符串,它仍会进入我的最终代码块。
我目前有一个for循环遍历整数列表中的每个项目,然后是一个if循环,如果有问题的参数不是int,则给出错误消息。我已经尝试了几个不同的版本,但这是最新版本,所以我把它放在下面。
for i in $@; do
if [ $i -ge 0 ] 2>/dev/null; then
echo "Invalid input: integers only."
exit 1
fi
done
答案 0 :(得分:1)
#!/bin/sh
#
for i in "$@"
do
case "${i#[-+]}" in
0)
echo cannot be 0?
exit 1
;;
*[!0-9]* | '')
echo not int
exit 2
;;
esac
done
echo i\'m ok
这对于正面和负面的整数都应该有用。如果你承认0是一个整数,只需删除第一个案例。
几乎重复:BASH: Test whether string is valid as an integer? 对于posix来说,这是一个很好的答案。 https://stackoverflow.com/a/18620446/7714132
答案 1 :(得分:0)
您可以使用正则表达式:
<强> my_script.sh 强>
for i in $@ ; do
if ! [[ "$i" =~ ^-?[0-9]+$ ]] ; then
echo "Invalid input: integers only."
exit 1
fi
done
示例:
$ sh my_script.sh 1 2 3 4
$ sh my_script.sh 1 2 -12
$ sh my_script.sh 1 2 -12-2
Not a number!
$ sh my_script.sh 1 2 a b
Not a number!
正则表达式的解释:
^
:字符串的开头-?
:字符-
[0-9]+
:1位或更多位$
:字符串答案 2 :(得分:0)
在POSIX sh
中,您可以使用case
将字符串与glob匹配:
#!/bin/sh
for i
do
case "$i" in
*[!0-9]*)
echo "Integers only" >&2
exit 1
esac
done
echo "Ok"
以下是它的运行方式:
$ ./myscript 1 2 3 4 5
Ok
$ ./myscript 1 2 3 4 5 a
Integers only
您的方法的问题主要在于您检查是否成功而不是失败:当输入无效时,[
将失败。