shell-变量的数值运算与特殊应用expr

1. expr(evaluate expressions)命令的用法:
  expr命令一般用于整数值,当也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器。
  语法:expr expression

[yanwei@yanwei-04 logs]$ expr 2 + 2
4
[yanwei@yanwei-04 logs]$ expr 2 - 2
0
[root@1-241 ~]# expr 2 * 2      
expr: 语法错误
[root@1-241 ~]# expr 2 * 2
4
[root@1-241 ~]# expr 2 + 2
4
[root@1-241 ~]# expr 2+2
2+2
[root@1-241 ~]# expr 2 / 2
1
[root@1-241 ~]# expr 2 ** 2
expr: 语法错误
[root@1-241 ~]# expr 2 % 2
0

  提示:
    1) 注意运算符左右都有空格
    2) 使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解星号的含义。

2. 增量计数
  expr在循环中可用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法为命令替代,最基本的一种是从expr命令接收输出并将之放入循环变量。
  例:给自变量i加1

[root@1-241 ~]# i=0
[root@1-241 ~]# i=`expr $i + 1`
[root@1-241 ~]# echo $i
1

  expr$[$a+$b]表达式形式,其中$a $b可以为整数值

[root@1-241 ~]# expr $[2+3]
5
[root@1-241 ~]# expr $[2*3]
6
[root@1-241 ~]# expr $[2**3]
8
[root@1-241 ~]# expr $[2/3]
0
[root@1-241 ~]# expr $[2%3]
2
[root@1-241 ~]# a=5
[root@1-241 ~]# b=6
[root@1-241 ~]# expr $[$a+$b]
11
expr 将其后的串解释为表达式并计算其值,运算符前后需有空格

  其他特殊用法:

expr 用法ssh-copy-id脚本
	if expr "$1":".*.pub"  ; then
		#expr id_dsa.pub : '.*.pub',匹配*.pub格式的文件如果是则为真。例:
		#[oldboy@oldboy .ssh]$ expr "id_dsa.pub" : ".*.pub"
		#10  这里是匹配后字符数
		#man expr
		#string :regexp
		anchored pattern match of regexp in string
[root@1-241 ~]# expr "test.pub" : ".*.pub" && echo 1 ||echo 0
8
1
[root@1-241 ~]# expr "test.x" : ".*.pub" && echo 1 ||echo 0
0
0

  通过expr判断变量是否为整数 

[root@1-241 scripts]# cat judge_int.sh 
read -p "pls input:"a
expr $a + 0 &>/dev/null
[ $? -eq 0 ] && echo int||echo chars
执行完
[root@1-241 scripts]# sh judge_int.sh 
pls input:a
chars

加强版:持续等待输入连续判断,整数就退出,错误继续判断输入
[root@1-241 scripts]# cat judge_int.sh 
while true
do
read -p "pls input:" a
	expr $a + 0 &>/dev/null
		if [ $? -eq 0 ] 
			then
			 echo int
			 exit 1
		else 
			echo chars
		fi
done
执行结果: [root@1-241 scripts]# sh judge_int.sh pls input:a chars pls input:r chars pls input:12 int

  通过expr计算字符串的长度

[root@1-241 scripts]# chars=`seq -s" " 100`
[root@1-241 scripts]# echo ${#chars}
291
[root@1-241 scripts]# echo $(expr length "$chars")
291

  

原文地址:https://www.cnblogs.com/scajy/p/12765521.html