Linux中的命令替换和数学运算

Linux 学习笔记


一、命令执行

命令替换允许你在一个命令中执行另一个命令,并将其输出作为参数或输入传递给外部命令。在Linux中,有两种主要的命令替换语法:

  • 反引号(`)替换:你可以使用反引号字符(`)将命令括起来,例如:
cat `ls`

这个语法已经被认为是过时的,不太推荐使用。

  • $() 替换:更常见和推荐的语法是使用 $(),例如:
cat $(ls)

命令替换非常有用,可以用于将命令的输出嵌套到其他命令中,或者将命令输出赋值给变量。


二、数学运算

1.expr 命令

expr 命令允许在命令行上处理数学表达式。

但是在脚本或命令行上使用时仍有问题出现,比如 expr 5 *2 就会出现语法的错误,要解决这个问题,对于那些容易被 shell 错误解释的字符,在它们传入 expr 命令之前,需要使用 shell 的转义字符(反斜线)将其标出来。

expr 5 \* 2

expr 命令在shell脚本中的使用:

$cat test.sh
#!/bin/bash
var1=10
var2=20
var3=$(expr $var2 / $var1)
echo teh result is $var3

执行上面的脚本test.sh的输出结果如下所示:

[root@localhost]# ./test.sh
teh result is 2

可以看到 test.sh 脚本中,要将一个数据算式的结果赋给一个变量,需要使用命令替换来获取expr命令的输出。

2. $[]

bash shell 提供了另外一种更简便的方法来执行数学表达式,在 bash 中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号将数学表达式围起来。

$[ operation ]

举例如下:

cat test1.sh
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo the result is $var4

执行结果如下:

[root@localhost]# ./test1.sh
teh result is 500

使用方括号来计算公式时,不需要担心 shell 会误解乘号或者其它符号。shell 知道它不是通配符,因为它在方括号内。

bash shell 数学运算符只支持整数运算,若要进行任何实际的数学计算,这是一个较大的限制。

3. bc

有几种方案能够克服 bash 中数学运算的整数限制。最常见的方案就是用内建的 bash 计算器,叫做 bc

可以在 shell 提示符下通过 bc 命令访问 bash计算器:

[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
12 * 5
60
12*1.2
14.4

如果要退出 bash 计算器,需要输入 quit

bash 计算器中的浮点运算是由内建变量 scale 控制的,必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果。

[root@localhost ~]# bc -q
3.44 / 5
0
scale=3
3.44 / 5
.688
quit

scale 变量的默认值是 0,在 scale 值被设置前,bash 计算器的计算结果不包含小数位。在将其值设置为 3 后,计算结果显示 3 位小数。-q选项可以不显示 bash 计算器冗长的欢迎信息。

除了普通数字外,bash 计算器还支持变量。

[root@locahost ~]# bc -q
var1=10
var2=2
var1*var2
20
var3=var1/var2
print var3
5
quit

在脚本中使用bc,可以使用命令替换运行bc命令,并将输出赋给一个变量,基本格式如下:

variable=$(echo "options; expression" |bc)

options 允许设置变量,如果不止一个变量,可以用分号将其分开。expression 参数定义了通过 bc 执行的数学表达式。

举例 1 如下:

cat test2.sh
#!/bin/bash
var1=100
var2=50
var3=$(echo "scale=2;$var1 / $var2"|bc)
echo the result is $var3
 
// 执行结果如下:
[root@localhost]# ./test2.sh
the result is 2.00

举例 2 :

cat test3.sh
#!/bin/bash
var1=20
var2=3.23456
var3=$(echo "scale=3;$var1 * $var1"|bc)
var4=$(echo "scale=3;$var3 * $var2"|bc)
echo the result is $var4

可以看到 test3 脚本中变量 var3 被赋值后,也可以用于其它运算。这种方法适用于较短的运算,但有时会涉及到更多的数字,如果需要进行大量的运算,在一个命令行中列出多个表达式就有点麻烦。

为了解决这个问题最好的方法就是使用内联输入重定向,它允许你直接在命令行中重定向数据,在 shell 脚本中,可以将输出赋给一个变量。

variable=$(bc <<EOF
options
statments
expressions
EOF
)

EOF 文本字符串标记了内联重定向数据的起止,仍然需要使用命令替换将 bc 命令的输出赋给变量。

举例如下:

cat test4.sh
#!/bin/bash
 
var1=10.46
var2=43.67
var3=33.2
var4=71
 
var5=$(bc <<EOF
scale=4
a1=($var1 * $var2)
b1=($var3 * $var4)
a1+b1
EOF
)
echo the result is $var5

需要注意的一点是在bash计算器中创建的变量只在bash计算器中有效,不能在shell脚本中使用。

比如:

cat test4.sh
#!/bin/bash
 
var1=10.46
var2=43.67
var3=33.2
var4=71
 
var5=$(bc <<EOF
scale=4
a1=($var1 * $var2)
b1=($var3 * $var4)
a1+b1
EOF
)
echo the result is $var5
 
var6=$[$a1 + 1]
 
echo $var6
 
 
输出结果为:
the result is 2813.9882
1

三、参考

https://blog.csdn.net/weixin_41561862/article/details/104207321

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dawn.Ki

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值