【发布时间】:2011-04-07 02:58:04
【问题描述】:
我想测试我的变量$var 是否实际上是一个整数。请问我该怎么做?
【问题讨论】:
标签: bash testing variables integer
我想测试我的变量$var 是否实际上是一个整数。请问我该怎么做?
【问题讨论】:
标签: bash testing variables integer
只要您使用的是 bash 版本 >=3,您就可以使用正则表达式:
[[ $a =~ ^-?[0-9]+$ ]] && echo integer
虽然this bash FAQ 提到了各种 bash 3.x 中 bash 正则表达式实现的不一致(是否应该引用正则表达式),但我认为在这种情况下,没有需要引用的字符在任何版本中,所以我们是安全的。至少它对我有用:
【讨论】:
一个 hackish-but-portable 解决方案是使用 test 的 -eq(整数相等)运算符将值与自身进行比较,并丢弃任何产生的错误消息:
is_int () { test "$@" -eq "$@" 2> /dev/null; }
for input in "0.3" "abc" "3"; do
if is_int "$input"; then
echo "Integer: $input"
else
echo "Not an integer: $input"
fi
done
【讨论】:
我需要一些只对正整数返回 true 的东西(而对于空字符串则失败)。我决定了:
test -n "$1" -a "$1" -ge 0 2>/dev/null
2>/dev/null 之所以存在,是因为如果输入(至 -ge)未解析为整数,测试会打印错误(并返回 2)
我希望它可以更短,但“测试”似乎没有“安静”选项,并将“”视为有效整数(零)。
【讨论】:
shopt -s extglob
case "$var" in
+([0-9]) ) echo "integer";
esac
【讨论】:
echo your_variable_here | grep "^-\?[0-9]*$" 如果是整数则返回变量,否则不返回任何内容。
【讨论】:
grep -q,它不会打印到标准输出,如果匹配,它只会以 0 或非 0 退出。
你可以这样做:
shopt -s extglob
if [ -z "${varname##+([0-9])}" ]
then
echo "${varname} is an integer"
else
echo "${varname} is not an integer"
fi
## 贪婪地从 "varname" 返回的值中删除正则表达式,因此如果 var 是整数则为 true,否则为 false。
它具有与最佳答案相同的弱点(使用“$foo != [!0-9]”),如果 $varname 为空,则返回 true。我不知道这是否有效。如果不只是将测试更改为:
if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ]
【讨论】:
if [[ "$varname" == +([0-9]) ]] 但 '[[' 不是标准 BASH,必须使用“正确的”正则表达式扩展而不是文件扩展。有人知道如何使我的解决方案起作用吗? :P
shopt -s extglob 我猜可以启用所需的模式语法:)
您可以执行 *2 /2 运算来检查值是否为数字和整数。 如果不是数字,则该操作返回 0
echo "Try with 10"
var=10
var1=`echo $((($var*2)/2))`
if [ "$var" == "$var1" ]; then
echo '$var integer'
else
echo '$var not integer'
fi
echo "Try with string"
var=string
var1=`echo $((($var*2)/2))`
if [ "$var" == "$var1" ]; then
echo '$var integer'
else
echo '$var not integer'
fi
【讨论】: