当前位置:

linux命令计算的相关命令expr、let、bc、(())、 $[]

访客 2024-01-11 681 0

一、expr

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

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

(2)语法:

exprargumentoperatorargument

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

(3)运用实例

$expr101020$expr15009002400$expr30/310$expr30/3/25$expr30\*390

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

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

exprlength”字符串“

2)应用实例

exprlength"xxxxx"5

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

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

2)应用实例

exprlength"abcdefg"13abc

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

exprindex被查找的字符串需要查找的字符

2)应用实例

exprlength"abcdefg"c3

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

exprmatch字符串正则表达式

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

2)应用实例

exprmatch"abcdefgm"".*m"8exprmatch"abcdefgm"".*g"7exprmatch"abcdefgm"".*x"0

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

expr字符串:正则表达式

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

2)应用实例

exprmatch"abcdefgm":".*m"8

二、let

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

2、语法

let赋值表达式

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

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

a=1b=2letc=abecho$c3

(2)变量和变量的区别

a=2letb=aecho$a$b32c=2letd=cecho$c$d33

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

a=4leta=2echo$a6

(4)乘法表示方法

b=2letb*=6;echo$b12

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[选项][参数]

对文件内容进行计算

catx.txt10022341402234#文件内编辑运算内容bc-qx.txt156196#直接得出每行结果

(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=16)):可以在计算完成后给变量赋值。
((b=a-1)):把a-1的计算结果赋值给b,此中的变量a前面不需要加$,(())具有自动解析双括号内的变量的功能。

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

a=$((16))b=$((a-1))c=$((ab))

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

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

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

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

五、$[]

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

2、语法

$[表达式]

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

3、应用实例

a=$[a=29]echo$a1#括号不需要空格和对特殊字符的处理b=$[c=2*a]echo$b22#c=2xad=$[a**2]echo$d121#d=a的2次方a=$[a**3]echo$e1331#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

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~