检查变量是否是一个数值
遇到一个简单的脚本需求,判断文件中每一行是否都是数字,如果存在非数字(如字母),就需要提示。
参考shell 判断变量为数字的N种方法提供的2个比较巧妙的方法:
- 方法一:通过 - expr计算变量和一个整数相加,如果能正常执行则为整数,否则执行出错。- $?是非零值:
expr $args + 0 &>/dev/null- 方法二(此方法更简便清晰):通过 - sed替换变两种的数字为空,如果执行过后变量完全变空,则表明是整数。
echo $args | sed 's/[0-9]//g'结合上述方法二,这里一段脚本判断文件中每一行是否是数值:
function check_file_all_num(){
    FILENAME=$1
    CHECK_FILE_NUM=`cat $FILENAME | sed 's/[0-9]//g' | grep -v "^$"`
    if [ -n "$CHECK_FILE_NUM" ]; then
        echo "$FILENAME is not all number" > /dev/null
        return 1
    fi
}
[ -n "$CHECK_FILE_NUM" ]的含义是判断字符串是否为null值 - shell中判断字符串null值
不过,上述方法只能判断整数,对于小数或者符号数值存在偏差
通过正则表达式判断字符串是否是数值
re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
   echo "error: Not a number" >&2; exit 1
fi如果要判断小数
^[0-9]+([.][0-9]+)?$带符号小数
^[+-]?[0-9]+([.][0-9]+)?$通过-eq数值运算符来判断是否是整数
-eq数值运算符来判断是否是整数在shell中,如果非整数,数值比较运算符-eq就会报错,可以用这个方法来判断是整数还是字符串:
#!/bin/bash
var=a
if [ "$var" -eq "$var" ] 2>/dev/null; then
  echo number
else
  echo not a number
fi参考
Last updated
Was this helpful?