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