一、expr

expr(evaluate expressions)命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作
1、整数运算
(1)注意:
  需要空格,需要加"\"不让特殊字符转义。

符号用法
\(反斜杠)放在 shell 特定的字符前面
“”(引号)对包含空格和其他特殊字符的字符串要用引号括起来

(2)语法:

expr argument operator argument

参数说明
argument:为第一个参数
operator:为操作运算符
argument:为第二个参数

(3)运用实例

$expr 10 + 10
20
$expr 1500 + 900
2400
$expr 30 / 3
10
$expr 30 / 3 / 2
5
$expr 30 \* 3
90

使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。

2、字符串操作
(1)计算字符串的长度语法
1)语法

expr length ”字符串“

2)应用实例

expr length "xxxxx"
5

(2)截取字符串语法
1)语法

expr substr ”字符串“ startNode endNode
参数含义
startNode截取字符串的起始位置,从1开始(注意编号从1开始,而不是0开始)
endNode截取字符串的结束位置,包含这个位置也被截取

2)应用实例

expr length "abcdefg" 13
abc

(3)获取一个字符在字符串中第一次出现的位置
1)语法

expr index 被查找的字符串  需要查找的字符

2)应用实例

expr length "abcdefg" c
3

(4)正则表达式匹配1语法
1)语法

expr match 字符串 正则表达式

a.正则表达式默认带有“^”,表示已什么开头
b.返回值为符合,匹配字符长度,否则返回0
c.正则表达式“."(点)代表任意一个字符
d.正则表达式中通配符“*”(星号)代表前面的字符可以出现0次到多次
e.“.*m”(点心m):匹配字符串中m前面的字符串长度(以任意长度字符开头到m结束且包含m,匹配m之前的长度。得出匹配字符串的长度)

2)应用实例

expr match "abcdefgm" ".*m"
8
expr match "abcdefgm" ".*g"
7
expr match "abcdefgm" ".*x"
0

(5)正则表达式匹配2语法,功能和1一样,语法比1简单
1)语法

expr 字符串 :正则表达式

a.正则表达式默认带有“^”,表示已什么开头
b.返回值为符合,匹配字符长度,否则返回0

2)应用实例

expr match "abcdefgm" : ".*m"
8

二、let

1、功能
  let命令进行整数数学运算赋值。
注意:
  let命令和双小括号(()),在数学计算方面功能一样,但是没有(())的功能强大,let只能用于赋值计算,不能直接输出,不可以和if条件判断一起使用

2、语法

let 赋值表达式

(1)语法功能等价于((表达式)),let后面的整数运算表达式中变量不需要加$,特殊字符前也不需要加“\”。
(2)多个表达式之间使用空格,而不是","号
(3)对于类似let a+b这样的写法,Shell虽然计算了a+b的值,但却将结果丢弃,如果echo let a+b会直接输出字符串a+b;若不想这样,可以使用let sum=a+b将a+b的结果保存在变量sum中

3、运用实例
(1)正常整数运算

a=1 b=2
let c=a+b
echo $c
3

(2)变量++和++变量的区别

a=2
let b=a++
echo $a $b
3 2
c=2
let d=++c
echo $c $d
3 3

(3)变量数值自增+2的表示方法

a=4
let a+=2
echo $a
6

(4)乘法表示方法

b=2
let b*=6;echo $b
12

4、总结
  (1)let数字整数计算用法
  (2)作用:用于赋值,是最简洁的整数运算赋值命令计算赋值用法: let变量名=整数运算表达式
  (3)多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 …

三、bc

1、功能
  完成整数及小数运算
(1)能够在bc中进行互动式的数学运算
(2)能够在shell中进行非互动式的bc管道运算
(3)能够在shell中非互动式的输入重定向bc运算

2、bc中的互动式的数学运算
(1)语法(作为系统计算器使用)

bc [选项] [参数]

对文件内容进行计算

cat x.txt
100+22+34
140+22+34
# 文件内编辑运算内容
bc -q x.txt
156
196
# 直接得出每行结果

(2)内置变量
  scale :指定精度,对计算结果指定保留小数;默认为0,即不使用小数部分只保留整数位。

3、bc在shell中进行非互动式的bc管道运算
(1)语法

echo "表达式" | bc [选项]

(2)将bc计算的结果赋值给shell变量
第一种方式:

A=$(echo "表达式" | bc [选项]

第二种方式:反引号

A=echo "表达式" | bc [选项] 

两种方式区别
  ``反引号是所有linux系统支持的方式。兼容性较好,但是容易与引号产生混淆
  $()不是所有linux系统都支持的方式。兼容性较差,但是不容易产生混淆
  
4、bc在shell中进行非互动式的输入重定向运算
(1)作用
将计算表达式输出给bc去执行,特点类似于文件中输入,可以输入多行表达式,更加清晰。
(2)语法
第一种方式:

A=`bc << EOF
第一行表达式
第二行表达式
第三行表达式
......................
EOF
` (反引号结束)

第二种方式:

A=$(bc << EOF
第一行表达式
第二行表达式
第三行表达式
......................
EOF
) 括号结束

四、(())

1、作用
  (())在运算表达式书写时,彼此之间有无空格都可以,遇到特殊字符时也不需要加“\”能够使用(())进行整数的数学运算。

2、解析
  双小括号(()),用于进行数学运算表达式的执行,将数学运算表达式放在((和))之间。可以使用$获取(())表达式命令的结果,这和使用$获得变量值是一样的

3、语法

((整数运算表达式))

4、用法
(1)给与双括号里面的变量赋值
((a=1+6)):可以在计算完成后给变量赋值。
((b=a-1)) :把a-1的计算结果赋值给b,此中的变量a前面不需要加$,(())具有自动解析双括号内的变量的功能。

(2)给与双括号外面的变量赋值

a=$((1+6))   
b=$((a-1))
c=$((a+b))

解析:
  可以在(())前面加上S符号获取(())命令的执行结果,从而获取整个表达式的值。以c=$((a+b))为例,即将a+b这个表达式的运算结果赋值给变量c。注意,如果c=((a+b)这样的写法是错误的,不加$就不能取得表达式的结果。

(3)于逻辑预算符进行使用
  ((a>7 && b==c)):(())也可以进行逻辑运算,在if语句中常会使用逻辑运算。
  echo $((a+10)):需要立即输出表达式的运算结果时,可以在(())前面加$符号
  ((a=3+5,b=a+10)):对多个表达式同时进行计算时,多表表达式使用"∵"号隔开

# 计算1+6并赋值给变量a
((a=1+6))
# 计算变量a-1赋值给变量b
((b=a-1))
# 计算变量a+变量b赋值给变量c
((a+b))
# 打印变量a,变量b,变量c的值
echo "a=${a},b=${b},c=${c}"
# $赋值写法
a=$((1+6)) b=$((b=a-1)) c=$((a+b))
# (())多个表达式计算赋值
((a=1+6,b=a-1,c=a+b))
# echo输出直接使用(())
echo "1+6=$((1+6))"
# (())用于逻辑表达式在if中使用
if ((a>7 && b==c))
	then
		echo "a>7 && b==c成立"
	else
		echo "a>7 && b==c 不成立"
fi

(4)总结
1)括号内赋值:((变量名=整数表达式))
2)括号外赋值:变量名=$((整数表达式))
3)多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式2...))
4)与if条件句配合使用:if((整数表达式))

五、$[]

1、功能
  能够使用$[ ]进行整数的数学运算。
  和(())、let命令类似,$[ ]也只能进行整数运算。但是只能对单个表达式的计算求值与输出,不能多个同属进行。

2、语法

$[表达式]

(1)$[ ]会对表达式进行计算,并取得计算结果
(2)表达式内部不可以赋值给变量没有(())功能强大

3、应用实例

a=$[a=2+9]
echo $a
1
# 括号不需要空格和对特殊字符的处理
b=$[c=2*a]
echo $b
22
# c=2xa
d=$[a**2]
echo $d
121
# d=a的2次方
a=$[a**3]
echo $e
1331
# d=a的3次方

六、总结

1、let赋值最方便 。
2、(())直接求值输出最方便,且支持多表达式同时运算。
3、expr
  优点:可以直接输出。
  缺点:计算表达式里面引用变量使用$,特殊字符需要转义只能计算一个表达式。
4、(())
  优点:直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值,可进行多表达式同时i计算,使用”,“互相分开。
  缺点:需要获值以后才可以输出。
5、let
  优点:赋值简单,特殊字符不需要转义,可进行多表达式同时i计算,使用空格互相分开。
  缺点:不能直接输出。

6、$[ ]
  优点:特殊字符不需要转义。
  缺点:不能进行多表达式同时计算。
7、bc可以计算整数和小数,在保留小数后几位,只有除法有效。

参考自:
https://blog.csdn.net/m0_62948770/article/details/126083511

更多推荐