shell 脚本检查输入是否为字符串/整数/浮点数

shell 脚本检查输入是否为字符串/整数/浮点数
#!/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 种可能性:

  1. 输入只有数字:打印“数字”(是否001002是整数取决于你正在考虑什么样的数学)。
  2. 输入由 0 个或多个数字、然后是一个点,然后仅包含数字(0 个或多个,因为.2在某些情况下可以被视为有效;如果您不想要这样,请将 更改为^\d*\.\d+$)组成^\d+\.\d+$
  3. 输入有数字,但没有仅有的数字:打印“混合,一些数字”。请注意,这还会捕获1.哪些不是有效的浮点数,哪些不是有效的整数。
  4. 输入没有数字:打印“无数字”。

我把 3 和 4 分开,但如果您愿意的话,您可以把它们合并起来并打印相同的内容。

另外,感谢 Karel用于思考+N-N数字

答案3

使用“测试”命令的副作用是什么?对怀疑是整数的字符串进行加权,例如1230对于相等性返回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

相关内容