在编写shell
脚本时往往需要判断变量是否为整数,然后根据其类型执行不同的操作,
借助expr
命令可以方便的实现此功能。expr
命令是一个手工命令行计数器,用于在UNIX/LINUX
下求表达式变量的值,一般用于整数值,也可用于字符串。
语法
表达说明
- 用空格隔开每个项;
- 用反斜杠
\
放在 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_SNum
与1
之和,如果变量TLS_SNum
是数字,则变量$?=0
,
否则$?=1
,
只有当变量是整数时才能比较它与其他数字的大小关系。这里需要特别注意,网络上一些教程计算TLS_SNum
与0
的和,但是当TLS_SNum=0
时,返回的$?=1
,
这会导致误判!!所以,我修改其为$TLS_SNum +1
.