Shell使用expr命令判断变量是否为整数

在编写shell脚本时往往需要判断变量是否为整数,然后根据其类型执行不同的操作, 借助expr命令可以方便的实现此功能。expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

语法

语法
1
expr 表达式

表达说明

  • 用空格隔开每个项;
  • 用反斜杠 \ 放在 shell 特定的字符前面;
  • 对包含空格和其他特殊字符的字符串要用引号括起来

使用举例

计算字符串长度

计算字符串长度
1
2
> expr length “this is a test
14

抓取字符串

抓取字符串
1
2
> expr substr “this is a test” 3 5
is is

抓取第一个字符数字串出现的位置

抓取第一个字符数字串出现的位置
1
2
> expr index "sarasara"  a
2

整数运算

整数运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 > expr 14 % 9
5
> expr 10 + 10
20
> expr 1000 + 900
1900
> expr 30 / 3 / 2
5
> expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
90
> expr 30 * 3
expr: Syntax error
> expr a + 1 (当使用一个字符与整数1相加时会返回提示“expr: 参数不是整数”)
expr: 参数不是整数
> echo $? (检测返回码,得到1, 这是后面进行整数判断的依据。)
1

判断整数的实现

整数判断
1
2
3
4
5
6
7
8
9
10
11
12
expr "$TLS_SNum" + 1 &> /dev/null
if [ $? -eq 0 ]; then
if [ $TLS_SNum -lt $1 -o $TLS_SNum -gt $2 ]; then
echo "编号超出范围,请重新选择编号!"
exit
else
NEO_OUT_H=$TLS_SNum
fi
else
echo "输入非数字,请重新输入编号!"
exit
fi

上述代码源于diary.sh脚本,其使用expr计算变量TLS_SNum1之和,如果变量TLS_SNum是数字,则变量$?=0, 否则$?=1, 只有当变量是整数时才能比较它与其他数字的大小关系。这里需要特别注意,网络上一些教程计算TLS_SNum0的和,但是当TLS_SNum=0时,返回的$?=1, 这会导致误判!!所以,我修改其为$TLS_SNum +1.