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

posted @ 2021-12-01 21:01  shines87  阅读(50)  评论(0)    收藏  举报