shell二 数学运算
一、expr
所有操作符左右两边都要有空格
数值操作符和比较操作符会将左右两边的变量转换为int数字型,转换失败则报错 比如expr 2.7 + shine
1、"string : \(REGEX\)" 字符串正则表达式匹配。返回匹配到的子串,没有\(\)则返回全串的长度
root@xu:/home/xu# echo `expr abcde : 'ab\(.*\)'; expr abcde : 'ab\(.\)'; expr abcde : 'ab.'; expr abcde : '.*cd*' ` cde c 3 4
2、"index string chars" 字符串中匹配到的任一字符的最小序号
root@xu:/home/xu# expr index abcde eoa
1
在eoa中逐个匹配abcde:其中e匹配序号为5, o匹配序号为0(即没有匹配到), a匹配到的序号为1, 最后返回匹配到的最小值1
3、"length string" 字符串长度
(base) root@xu:/home/xu/work# echo $var; echo ${#var}; expr length $var shine20034 10 10
root@xu:/home/xu# echo $var; echo ${#var}; expr length $var shine20034 10 10
4、四则运算+ - * / %
*是shell的元字符,需要转义使用 \* 或 '*' 。试运行 a=10; expr $a + 2; expr $a / 3; expr $a % 3; expr $a '*' 3

5、比较运算 =、!=、'>'、'>='(转义)
正确返回1,错误返回0。试运行 a=10; expr $a = 10; expr $a '<=' 10; expr $a '>' 10 返回1 1 0
6、逻辑运算 '&'、'|'(转义)
二、let、$(())、$[]基本整数运算(算术|逻辑运算)支持c++的基本运算(++,+=,+-*/)无需转义
root@xu:/home/xu# var=10; let var+=8; let flg=(var== 18); echo $var $flg 18 1 root@xu:/home/xu# echo $var $[var/=3] $[var*=2]; r=$[++var>= 10]; echo $r $var 18 6 12 1 13
对比expr、let、$[]:
赋值符号左右都不能有空格, expr则是所有操作符左右都不能有空格
let的方式不能命令替换:var=`expr $a '*' 3`; var=$[++var >=10]
expr需要对'*' '>'转义
expr需要使用$a这一引用符号,let和$[]可要可不要
三、bc高级运算
apt install bc,用于浮点计算 有非常丰富强大的功能。
使用格式 var=`echo "option1;option2;...;expression"|bc` ,option:变量赋值初始化、设置精度scale(必须有,否则输出整数)。expression返回值赋给var
命令行使用 vs 脚本使用
root@xu:/home/xu# var=`echo "scale=3; r=3; pi=3.1415926; pi*r*r"|bc`; echo $var 28.2743334 root@xu:/home/xu# cat temp.sh #!/bin/bash var1=haha var2=hehe value=`bc<<EOF # 在反引号中使用here string的方式 scale=3 r=3 3.1415*r*r EOF` echo $value root@xu:/home/xu# ./temp.sh 28.2735
输出小于1的浮点数:并不会正常输出0.2, 需要额外设置!
总结这些是为找到最舒适的运算:$[]和bc
2021-12-08 14:54:52

浙公网安备 33010602011771号