我想测试一下我的变量$var
是否为整数。请问如何实现?
[[ $a =~ ^-?[0-9]+$ ]] && echo integer
虽然这个bash FAQ提到在各种bash 3.x中的bash正则表达式实现中存在不一致性(是否应该引用正则表达式),但我认为在此情况下,任何版本都不需要引用任何字符,所以我们很安全。至少在以下版本中对我有效:
$ a="" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a=" " $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a="a" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a='hello world!' $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a='hello world 42!' $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a="42" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 整数 $ a="42.1" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a="-42" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 整数 $ a="two" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer
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
test -n "$1" -a "$1" -ge 0 2>/dev/null
因为如果输入(到-ge)不能解析为整数,测试会打印错误(并返回2),所以有2>/dev/null
。shopt -s extglob
case "$var" in
+([0-9]) ) echo "integer";
esac
shopt -s extglob
if [ -z "${varname##+([0-9])}" ]
then
echo "${varname} is an integer"
else
echo "${varname} is not an integer"
fi
##贪婪地从“varname”返回的值中删除正则表达式,因此如果变量是整数,则为真;否则为假。
它与顶部答案(使用“$foo!= [!0-9] ”)具有相同的弱点,即如果$varname为空,则返回true。我不知道是否有效。如果无效,请将测试更改为:
if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ]
if [[ "$varname" == +([0-9]) ]]
,但“[[”不是标准BASH,必须使用“正确”的正则表达式扩展而不是文件扩展。有人知道如何使我的解决方案工作吗? :P - Svend Hansenshopt -s extglob
,我猜是启用了所需的模式语法 :) - Svend Hansenecho your_variable_here | grep "^-\?[0-9]*$"
如果变量是整数,则返回该变量,否则不返回任何内容。
grep -q
,它不会打印到stdout,只有在匹配时才会以0或非0退出。 - Adam Rosenfieldecho "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