【shell】数值加减乘除|运算|字符串转数字|提取数字字母小数|大小写转换

即看即用

数值变量的运算及特殊变量

数值计算

shell 包含三个命令:bc、expr、let可用于数值计算

bc 

expr

let

[]和(()) 计算|变量计算

(())运算

$[]整数运算

浮点运算

字符数值转换

从字符串中提取数字|字母|小数

echo "2014年7月21日" | tr -cd "[0-9]"

提取数字

grep命令提取小数:

字母大小写转换

${str^^}

echo str | tr 'a-z' 'A-Z'

${str^}

${str,,}

echo str | tr 'A-Z' 'a-z'

${str~~}

字符截取方法


即看即用

a=10
b=3
c=0

# 仅支持整数运算  ==========================


((c++));   echo $c
((c=a+5)); echo $c
((c=a+b)); echo $c
((c=a-b)); echo $c
((c=a*b)); echo $c
((c=a/b)); echo $c
((c=a%b)); echo $c


# 支持浮点数运算  ============================

a=10.5
b=3.3

c=$(awk 'BEGIN{print 3.02*5.3}');               echo $c # 16.006
c=$(awk -v a=10.5 -v b=3.3 'BEGIN{print a*b}'); echo $c # 34.65
c=$(awk -v a=10.5 -v b=3.3 'BEGIN{print a/b}'); echo $c # 3.181818181818182
# 或

c=$(echo "scale=3;$a*$b"| bc); echo $c # 34.65   #scale=3 表示保留3位小数
c=$(echo "scale=4;$a/$b"| bc); echo $c #3.1818    #scale=4 表示保留4位小数

数值变量的运算及特殊变量


运算符与变量之间必须有至少一个空格。

运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
运算符号:( ( ) ) 和 (()) 和(())和[]
运算命令:expr和let
运算工具:bc(系统自带), 支持小数运算

简单的数学计算可以使用(()),复杂的计算使用awk或bc,不推荐使用expr

数值计算

shell 包含三个命令:bc、expr、let可用于数值计算

let和expr  :只支持整数

bc和awk:支持浮点数

输出:bc、expr可直接显示计算结果;let则丢弃计算结果,可通过传递结果到变量,取变量值获得计算结果。

bc 

使用bc进行运算,支持小数运算,但在脚本中不可直接使用,否则会进入交互界面,可以用echo结合管道使用

交换模式:

[root@localhost ~]# bc

#默认整数
10/3
3

#可以先输入scale= 指定保留小数点后几位
scale=3 //指定小数点后几位
10/3
3.333

非交换模式:

[root@localhost ~]# echo “scale=3;10/3” | bc
3.33310

[root@client ~]# echo “3^2” | bc //做幂的运算,计算3的平方
9

bc做变量的运算:
[root@localhost ~]# a=10
[root@localhost ~]# b=3
[root@localhost ~]# echo "$a/$b" | bc
3
[root@localhost ~]# echo "scale=2;$a/$b" | bc
3.33

bc还可以做逻辑运算,真为1,假为0
[root@client ~]# echo "2>2" | bc
0
[root@client ~]# echo "2==2" | bc
1
[root@client ~]# echo "2<2"| bc
0

expr

a=10
b=3
expr $a + $b
expr $a - $b
expr $a \* $b  #* 号需要转译
expr $a / $b
expr $a % $b

------------------------------------------------------

let

有bc 工具为什么还要用let?

  • let 是 Bash shell 的内置命令,因此可以在 Shell 脚本中直接使用,无需外部命令(需要注意路径问题)
  • let 可以直接使用变量进行计算,无需额外的语法和引用符号。
  • let 专注于整数计算,可以比 bc 更高效地执行简单的整数运算

let的运算可以改变变量本身的值,但不显示结果,需要echo,其他的运算方式可以做运算但不改变变量本身的值

[root@localhost ~]# let i=300+5
[root@localhost ~]# echo $i
305
[root@localhost ~]# let i=300-5
[root@localhost ~]# echo $i
295
[root@localhost ~]# let i=300/*5
[root@localhost ~]# echo $i
1500
[root@localhost ~]# let i=300/5
[root@localhost ~]# echo $i
60

[root@server myscripts]# n=1;let n=n+1;echo $n
2
[root@server myscripts]# let n+=2 //n=n+2
[root@server myscripts]#
[root@server myscripts]# echo $n
4
[root@server myscripts]# let n=n**2 //求幂,4的2次方
[root@server myscripts]# echo $n
16
[root@server myscripts]# let n++ //n自加1
[root@server myscripts]# let n-- //n自减1

[root@client opt]# echo $a
13



原文链接:https://blog.csdn.net/weixin_69343040/article/details/125593098

-----------------------------------------------------

经测试,bc允许运算量和运算符之间无空格,let 不允许有空格,expr运算量和运算符之间必须有空格。

[root@localhost ~]# let i = 5 + 3
-bash: let: =: syntax error: operand expected (error token is "=")

[root@localhost ~]# echo 300+5 |bc
305

[root@localhost ~]# expr 300+5
300+5

参考:

let的使用   http://www.cublog.cn/u/3374/showart_225918.html  

expr字符处理 http://bkeep.blog.163.com/blog/static/123414290201054111712718/

expr乘法运算符 http://blog.163.com/lgh_2002/blog/static/44017526200911804630930/

shell数值运算多种方法 http://jidiblog.blog.51cto.com/140821/282481
————————————————
原文链接:https://blog.csdn.net/praylucky/article/details/6252963

[]和(()) 计算|变量计算

[]和(()) 必须要和echo在一起用因为他只能运算无法输出结果

(())运算

a=10
b=5

echo '$a+$b=' $(( a +  b ))            #输出
echo '$a-$b=' $(( a -  b ))
echo '$a*$b=' $(( a *  b ))
echo '$a/$b=' $(( a /  b ))
echo '$a%$b=' $(( a %  b ))

#或

(( c = a + b )) ; echo '$a+$b=' $c
(( c = a - b )) ; echo '$a-$b=' $c
(( c = a / b )) ; echo '$a/$b=' $c
(( c = a % b )) ; echo '$a%$b=' $c

$[]整数运算

[root@server myscripts]# echo [ 10 ∗ 10 ] / / [10*10] //[10∗10]//[]里的*不需要转义
100
[root@server myscripts]# echo $[10%8]
2
[root@server myscripts]# echo $[10/8]
1
[root@server myscripts]# echo $[10/12]
0
[root@server myscripts]# echo $[10%12]
10

[ ] 变 量 的 运 算 , 可 省 略 [ ] 里 的 []变量的运算,可省略[]里的[]变量的运算,可省略[]里的
[root@client opt]# echo [ [[a+$b]
13
[root@client opt]# echo $[a+b]
13
[root@client opt]# echo $[a-b]
7
[root@client opt]# echo $[a*b]
30
[root@client opt]# echo $[a/b]
3
[root@client opt]# echo $[a%b]
1

[root@client opt]# echo $[a+b+c]
38
[root@client opt]# echo $[a+b*c] //遵循先乘除后加减,否则需要用括号括起来表示优先运算
75
[root@client opt]# echo $[(a+b)*c]
360
[root@client opt]# echo $[a++] //先输出再自增1,这时a的值已经变了
13
[root@client opt]# echo $a
14
[root@client opt]# echo $[++a] //先自增1再输出,所以直接输出了变化后的值
15
[root@client opt]# echo $a
15
原文链接:https://blog.csdn.net/weixin_69343040/article/details/125593098

浮点运算

运算出现浮点数的时候,需要用到 echo " "|bc 当然,这个写法也可以用在整形计算上

a=1.6
b=2
c=$(echo "$a*$b"|bc)    # 3.2
a=$(awk 'BEGIN{print 3.02*5.3}')  # 16.006

(更多见前面的bc介绍)

字符数值转换

shell去除字符串前所有的0

[root@localhost sh]# str=00007985566465
[root@localhost sh]# str_new=$(echo -e $str | sed -r 's/0*([0-9])/\1/')
[root@localhost sh]# echo $str_new
7985566465

字符串转数值

a=“08”

b=echo $a|awk '{print int($0)}'

echo $b

输出:8

从字符串中提取数字|字母|小数

 1 #/bin/bash
 2 #正则表达式写在[]里,^代表非
 3 echo " 0ab12 AB34 Cc " | sed 's/[^0-9]//g'
 4 #输出 01234
 5 echo " 0ab12 AB34 Cc " | sed 's/[^a-z]//g'
 6 #输出 abc
 7 echo " 0ab12 AB34 Cc " | sed 's/[^a-zA-Z]//g'
 8 #输出 abABCc
 9 echo " 0ab12 AB34 Cc " | sed 's/[0-9]//g'
10 #输出 ” ab AB Cc “,输出内容包含空格

过滤出只出现某些字符:-d删除 -c 反选(过滤数字,过滤字母)

echo "cdnj289709" | tr -dc "0-9" #289709 过滤出全是数字的,最后不换行

echo "cdnj289709" | tr -dc "a-z" #cdnj 过滤出全是小写字母的,最后不换行

echo "cdnj289709" | tr -dc "A-Z" #过滤出全是大写字母的,最后不换行

echo "2014年7月21日" | tr -cd "[0-9]"

这样就可以提取出2014721

释义tr -cd "[0-9]"

    tr是translate的缩写,主要用于删除文件中的控制字符,或者进行字符转换

    -d表示删除,[0-9]表示所有数字,-c表示对条件取反

    tr -cd "[0-9]" 的即:剔除非数字的字符,即输出 20181212

提取数字

echo "lcx-20129.89_66AB-7777.0_88.txt"|grep -Po "\d+\.\d+"

20129.89
7777.0

grep命令提取小数:

1 #/bin/bash
2 #转化为提取小数点两侧的整数
3 echo "  *3.2-& " | grep -oP '\d*\.\d+'
4 #输出 3.2

(参考:https://www.cnblogs.com/liangxuran/p/14578866.html)

字母大小写转换

全部转换成大写

${str^^}

echo str | tr 'a-z' 'A-Z'

首字符转换成大写

${str^}

全部转换成小写

${str,,}

echo str | tr 'A-Z' 'a-z'

全部逆转

${str~~}

shell之大小写转换_https://blog.csdn.net/happytree001/article/details/120981639


 

字符截取方法


原文:https://www.jb51.net/article/56563.htm

https://www.cnblogs.com/cangqinglang/p/11952838.html

解决类型
 假设有变量 var=http://www.aaa.com/123.htm.

1. # 号截取,删除左边字符,保留右边字符。

1

echo ${var#*//}

 其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm

2. ## 号截取,删除左边字符,保留右边字符。

1

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/

结果是 123.htm

3. %号截取,删除右边字符,保留左边字符

1

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:http://www.aaa.com

4. %% 号截取,删除右边字符,保留左边字符

1

echo ${var%%/*}

 %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

5. 从左边第几个字符开始,及字符的个数

1

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6. 从左边第几个字符开始,一直到结束。

1

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7. 从右边第几个字符开始,及字符的个数

1

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

8. 从右边第几个字符开始,一直到结束。

1

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

汇总
最后,我们对以上 8 种格式做一个汇总,请看下表:

格式    说明
${string: start :length}    从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start}    从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length}    从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start}    从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars}    从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars}    从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%chars*}    从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%%chars*}    从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
 

原文链接:https://blog.csdn.net/bandaoyu/article/details/113770557

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值