expr可以用于整数运算,也可以用于字符串长度、匹配等计算。
示例1:整数运算:
[root@vm1 scripts]# expr 2 + 2
4
[root@vm1 scripts]# expr 2 * 2
expr: syntax error
[root@vm1 scripts]# expr 2 \* 2
4
[root@vm1 scripts]# expr 2 / 2
1
说明:
1)运算符和计算的数字左右都必须至少有一个空格。
2)使用乘号的时候,使用反斜线屏蔽其特定的含义。不然会有语法错误。
示例2:增量计算:
[root@vm1 ~]# i=0
[root@vm1 ~]# i=`expr $i + 6`
[root@vm1 ~]# echo $i
6
说明:expr可以进行变量计算,需要使用反引号将公式括起来。
expr在循环中可用于增量计算。
示例3:expr $[$a + $b]表达式形式:这个是$中括号的功能。
[root@vm1 ~]# expr $[2 + 3]
5
[root@vm1 ~]# expr $[2 * 3]
6
expr的特殊用法:
示例4:通过expr判断文件扩展名是否符合要求:
说明:
1)这是ssh-copy-id这个工具的文件内容:ssh服务自带的公钥分发脚本。
2)通过expr "$L_ID_FILE" : ".*\.pub$" 匹配*.pub格式的文件如果是则为真。如果是真的话,则就是这个文件名,否则就给这个文件加上.pub。
3)判断这个文件名是不是.pub结尾。这里也使用了正则表达式,所以有时间把正则这块的内容进行复习掌握。Python的课程里也讲解了正则表达式的内容。
4)在这个公钥分发脚本中增加这部分代码的目的是为了防止用户发送私钥,脚本中会自动加上.pub扩展名。
man expr帮助:
我们从man expr可以看到专门的帮助内容。man文档看来还是要看,特别是当某个命令不是很熟悉的时候,还是要通过man来帮助。多阅读英文。
[root@vm1 ~]# expr "test.pub" : ".*\.pub$" && echo 1 || echo 0
8
1
[root@vm1 ~]# expr "test.pub" : ".*\.pub$" > /dev/null && echo 1 || echo 0
1
[root@vm1 ~]# expr "test.pu" : ".*\.pub$" > /dev/null && echo 1 || echo 0
0
[root@vm1 ~]# cat expr1.sh
#!/bin/bash
#
if expr "$1" : ".*\.pub$" > /dev/null ; then
echo "you are using $1"
else
echo "please use .pub file"
fi
[root@vm1 ~]# sh expr1.sh 1.sh
please use .pub file
[root@vm1 ~]# sh expr1.sh 1.pub
you are using 1.pub
示例5:判断一个变量值或者字符串是否为整数。
[root@vm1 scripts]# i=5
[root@vm1 scripts]# expr $i + 6 &>/dev/null
[root@vm1 scripts]# echo $?
0
[root@vm1 scripts]# i=oldboy
[root@vm1 scripts]# expr $i + 6 &>/dev/null
[root@vm1 scripts]# echo $?
2
这是一个技巧:
利用expr做计算的时候,变量或字符串必须是整数的规则,把一个变量或字符串和一个已知的整数6相加,看命令返回的值是否为0,如果是0,则说明是变量或字符串是整数,否则就不是整数。
提升例:
[root@vm1 scripts]# cat judge_int.sh
#!/bin/bash
while true
do
read -p "Please input: " a
expr $a + 0 >/dev/null 2>&1
[ $? -eq 0 ] && echo "int" || echo "chars"
done
[root@vm1 scripts]# sh judge_int.sh
Please input: 13
int
Please input: chang
chars
示例3:利用expr来计算字符串的长度:
[root@vm1 ~]# NAME="changchunhua"
[root@vm1 ~]# echo ${#NAME}
12
[root@vm1 ~]# expr length $NAME
12
[root@vm1 ~]# echo $NAME | wc -L
12
再强调下man的用法:
我们查下man expr:
这是计算长度。
然后我们还看到substr和index两个。