shell中计算命令详解(expr、(())、 $[]、let、bc )
目录
一、expr命令
expr (evaluate expressions的缩写)。"表达式求值"。Shell expr是一个功能强大。并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。
空格 | 隔开每个项 |
\(反斜杠) | 放在 shell 特定的字符前面 |
“”(引号) | 对包含空格和其他特殊字符的字符串要用引号括起来 |
1、整数运算(注意需要空格,需要加"\"不让特殊字符转义)
1、获取计算的结果赋值给新变量的语法
可以使用$()和 两个反撇好”``“ 表示。
2、字符串语法
1、计算字符串的长度语法
语法:expr length
2、截取字符串语法
语法:expr substr ”字符串“ start end
#start 截取字符串的起始位置,从1开始(注意编号从一开始,而不是0开始)
#end截取字符串的结束位置,包含这个位置也被截取
(start=1;end=2)
3、获取一个字符在字符串中第一次出现的位置
语法:expr index 被查找的字符串 需要查找的字符
4、正则表达式匹配1语法
语法: expr match 字符串 正则表达式
#正则表达式默认带有“^”,表示已什么开头
#返回值为符合,匹配字符长度,否则返回0
#正则表达式“."(点)代表任意一个字符
#正则表达式中通配符“*”(星号)代表前面的字符可以出现0次到多次
#“.*m”(点心m):匹配字符串中m前面的字符串长度(以任意长度字符开头到m结束且包含m,匹配m之前的长度。得出匹配字符串的长度)
5、正则表达式匹配2语法,功能和1一样,语法比1简单
语法:expr 字符串 :正则表达式
#正则表达式默认带有“^”,表示已什么开头
#返回值为符合,匹配字符长度,否则返回0
expr 小结:
1.整数计算:
expr 整数运算表达式
2字符串操作:
expr length 字符串 :获取字符串的长度
expr substr 字符串 start end : 截取字符串
expr index 字符串 查找的字符 :查找字符在字符串中第一次出现的位置,位置从1开始的
(expr match 字符串 正则表达式);(expr 字符串 : 正则表达式)
二、计算命令 :(()) 命令
1、作用
(())在运算表达式书写时,彼此之间有无空格都可以,遇到特殊字符时也不需要加“\”
能够使用(())进行整数的数学运算
2、介绍
双小括号(()),用于进行数学运算表达式的执行,将数学运算表达式放在((和))之间。可以使用$获取(())表达式命令的结果,这和使用$获得变量值是一样的。
3、语法
((整数运算表达式))
4、用法
① 给与双括号里面的变量赋值
((a=1+6)) 可以在计算完成后给变量赋值。
((b=a-1)) 把a-1的计算结果赋值给b,此中的变量a前面不需要加$,(())具有自动解析双括号内 的变量的功能。
②给与双括号外面的变量赋值
a=$((1+6))
b=$((a-1))
c=$((a+b))
解析:可以在(())前面加上S符号获取(())命令的执行结果,从而获取整个表达式的值。以c=$((a+b))为例,即将a+b这个表达式的运算结果赋值给变量c。注意,如果c=((a+b)这样的写法是错误的,不加$就不能取得表达式的结果。
③于逻辑预算符进行使用
((a>7 && b==c)) : (())也可以进行逻辑运算,在if语句中常会使用逻辑运算。
echo $((a+10)) : 需要立即输出表达式的运算结果时,可以在(())前面加$符号
((a=3+5,b=a+10)) : 对多个表达式同时进行计算时,多表表达式使用"∵"号隔开
需求:
1、计算1+6并赋值给变量a
2、计算变量a-1赋值给变量b
3、计算变量a+变量b赋值给变量c
4、打印变量a,变量b,变量c的值
5、$赋值写法
6、(())多个表达式计算赋值
7、 echo输出直接使用(())
8、 (())用于逻辑表达式在if中使用
(()) 用法 小结:
1、括号内赋值:((变量名=整数表达式))
2、括号外赋值:变量名=$((整数表达式))
3、多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式2...))
4、与if条件句配合使用: if((整数表达式))
三、let 命令详解
功能:能够使用let进行整数数学运算赋值
let命令和双小括号(()),在数学计算方面功能一样,但是没有(())的功能强大,let只能用于赋值计算,不能直接输出,不可以和if条件判断一起使用。
语法:let 赋值表达式
1、语法功能等价于((表达式)),let后面的整数运算表达式中变量不需要加$,特殊字符前也不需要加“\”
2、多个表达式之间使用空格 而不是","号
3、对于类似let a+b这样的写法,Shell虽然计算了a+b的值,但却将结果丢弃,如果echo let a+b 会直接输出字符串 a+b;若不想这样。可以使用1et summa+b将a+b的结果保存在变量sum中
示例:正常整数运算
变量++和++变量的区别
变量数值自增+2的表示方法
乘法表示方法
let 命令小结:
1、let数字整数计算用法
2、作用:用于赋值,是最简洁的整数运算赋值命令计算赋值用法: let变量名=整数运算表达式
3、多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 ...
四、$[] 命令
1、功能
能够使用$[ ]进行整数的数学运算
和(())、let命令类似,$[ ]也只能进行整数运算。但是只能对单个表达式的计算求值与输出,不能多个同属进行。
2、语法
格式:$[表达式]
①$[ ]会对表达式进行计算,并取得计算结果
②表达式内部不可以赋值给变量没有(())功能强大
3、用法
五、bc 命令
1、功能:
完成整数及小数运算
①能够在bc中进行互动式的数学运算
②能够在shell中进行非互动式的bc管道运算
③能够在shell中非互动式的输入重定向bc运算
Ⅰ:bc中的互动式的数学运算
2、语法
语法一(作为系统计算器使用)
格式:bc [选项] [参数]
还可以对文件内容进行计算
3、内置变量
scale :指定精度,对计算结果指定保留小数;默认为0,即不使用小数部分只保留整数位。
Ⅱ: bc在shell中进行非互动式的bc管道运算
1、语法
echo "表达式" | bc [选项]
2、将bc计算的结果赋值给shell变量
第一种方式:
A=$(echo "表达式" | bc [选项])
第二种方式:反引号
A=`echo "表达式" | bc [选项]`
两种方式区别:``反引号是所有linux系统支持的方式。兼容性较好,但是容易与引号产生混淆
$()不是所有linux系统都支持的方式。兼容性较差,但是不容易产生混淆
Ⅲ: bc在shell中进行非互动式的输入重定向运算
1、作用
将计算表达式输出给bc去执行,特点类似于文件中输入,可以输入多行表达式,更加清晰
2、语法
第一种方式:
A=`bc << EOF
第一行表达式
第二行表达式
第三行表达式
......................
EOF
` (反引号结束)
第二种方式:
A=$(bc << EOF
第一行表达式
第二行表达式
第三行表达式
......................
EOF
) 括号结束
总结:
let 赋值最方便
(()) 直接求值输出最方便,且支持多表达式同时运算
expr 优点:可以直接输出
缺点:计算表达式里面引用变量使用$,特殊字符需要转义只能计算一个表达式
(()) 优点:直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值,可进行多表达式 同时i计算,使用”,“互相分开
缺点:需要获值以后才可以输出
let 优点:赋值简单,特殊字符不需要转义,可进行多表达式同时i计算,使用空格互相分开
缺点:不能直接输出
$[ ] 优点:特殊字符不需要转义
缺点: 不能进行多表达式同时计算
bc 可以计算整数和小数,在保留小数后几位,只有除法有效
更多推荐
所有评论(0)