#!/bin/bash
read -p "Enter value:" val
echo "$val"|grep "^[0-9]*$"
val="$?"
if [[ $val == 0 ]]
then
echo "Integer"
exit
fi
echo $val|grep "^[a-zA-Z]*$"
val="$?"
if [[ $val == 0 ]]
then
echo "String"
exit
fi
echo $val|grep "^[0-9]*.[0-9]*$"
val="$?"
if [[ $val == 0 ]]
then
echo "Float"
exit
fi
如果我输入像“ape”这样的字符串,它会显示“grep invalid range”,然后打印浮点数。我哪里做错了?
答案1
此 bash 代码对于整数(如 123)返回整数,对于浮点数(如 123.4)返回浮点数,对于任何其他输入值(如“123”、One23 123. 或 123.4.5)返回字符串。
#!/bin/bash
read -p "Type a number or a string: " input
if [[ $input =~ ^[+-]?[0-9]+$ ]]; then
echo "Input is an integer."
elif [[ $input =~ ^[+-]?[0-9]+\.$ ]]; then
echo "Input is a string."
elif [[ $input =~ ^[+-]?[0-9]+\.?[0-9]*$ ]]; then
echo "Input is a float."
else
echo "Input is a string."
fi
答案2
我无法重现您的错误,但由于它抱怨范围无效,因此很可能是一个locale
问题。尝试再次运行脚本,但设置语言环境:
LC_ALL=C yourscript.sh
当然,这并不能解决另一个问题:
echo $val|grep "^[a-zA-Z]*$"
val="$?"
在这些行之后,$val
不再是您指定的值,它现在是的退出状态grep
,因此之后的所有内容都在测试错误的内容。
无论如何,这确实没有必要那么复杂。你真正需要的是:
#!/bin/bash
val="$@"
[[ -z $val ]] && echo "No input!" && exit
if [[ "$val" =~ ^[+-]?[0-9]+$ ]]; then
echo "Number!"
elif [[ $val =~ ^[+-]?[0-9]*\.[0-9]+$ ]]; then
echo "Float!"
elif [[ $val =~ [0-9] ]]; then
echo "Mixed, some numbers"
else
echo "No numbers!"
fi
请注意,我使用的val="$@"
是 而不是read
。这意味着您现在可以以 运行脚本,而不必每次都输入。这样,您就可以在历史记录中看到您所做的操作,避免输入错误,可以自动运行脚本等。使用并强迫用户输入yourscript.sh input
通常是一个坏主意。read
另请注意,我更改了您的一些术语。我现在考虑 4 种可能性:
- 输入只有数字:打印“数字”(是否
001002
是整数取决于你正在考虑什么样的数学)。 - 输入由 0 个或多个数字、然后是一个点,然后仅包含数字(0 个或多个,因为
.2
在某些情况下可以被视为有效;如果您不想要这样,请将 更改为^\d*\.\d+$
)组成^\d+\.\d+$
。 - 输入有数字,但没有仅有的数字:打印“混合,一些数字”。请注意,这还会捕获
1.
哪些不是有效的浮点数,哪些不是有效的整数。 - 输入没有数字:打印“无数字”。
我把 3 和 4 分开,但如果您愿意的话,您可以把它们合并起来并打印相同的内容。
另外,感谢 Karel用于思考+N
和-N
数字。
答案3
使用“测试”命令的副作用是什么?对怀疑是整数的字符串进行加权,例如123
,0
对于相等性返回0
(true) 或1
(false) 或2
(error)。这直接告诉您字符串是否值得比较,即它是否是有效的整数表示:
[ $str2test -eq 0 ] 2>/dev/null
if [ $? -lt 2 ]
then
\# Correct integer representation
...
else
\#Incorrect integer representation
...
fi
答案4
!/bin/bash
read -p "Enter value:" val
echo "$val"|grep "^[0-9]*$"
val="$?"
if [[ $val == 0 ]]
then
echo "Integer"
exit
fi
echo $latter|grep "^[a-zA-Z]*$"
latter="$?"
if [[ $latter == 0 ]]
then
echo "String"
exit
fi