在编写shell脚本时往往需要判断变量是否为整数,然后根据其类型执行不同的操作,
借助expr命令可以方便的实现此功能。expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
语法
语法
表达说明
- 用空格隔开每个项;
- 用反斜杠 \放在shell特定的字符前面;
- 对包含空格和其他特殊字符的字符串要用引号括起来
使用举例
计算字符串长度
计算字符串长度| 12
 
 | > expr length “this is a test”14
 
 | 
 
抓取字符串
抓取字符串| 12
 
 | > expr substr “this is a test” 3 5is is
 
 | 
 
抓取第一个字符数字串出现的位置
抓取第一个字符数字串出现的位置| 12
 
 | > expr index "sarasara"  a2
 
 | 
 
整数运算
整数运算| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 |  > expr 14 % 95
 > 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
 
 | 
 
判断整数的实现
整数判断| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | expr "$TLS_SNum" + 1 &> /dev/nullif [ $? -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_SNum与1之和,如果变量TLS_SNum是数字,则变量$?=0,
否则$?=1,
只有当变量是整数时才能比较它与其他数字的大小关系。这里需要特别注意,网络上一些教程计算TLS_SNum与0的和,但是当TLS_SNum=0时,返回的$?=1,
这会导致误判!!所以,我修改其为$TLS_SNum +1.