1、命令替换
shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。有两种方法可以将命令输出赋值给变量。
第一,反引号字符 ``
第二,$()格式
2、输出输入重定向
输出重定向:最基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能。
有时,你可能并不想覆盖文件原有的内容,而是想将命令的输出追加到已有文件中,这种情况下可以使用双大于号(>>)来追加数据。
输入重定向:输入重定向将文件的内容重定向到命令,而非将命令的输出重定向到文件。输入重定向符号是小于号(<)。还有另外一种输入重定向的方法,称为内联输入重定向。这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。
内联输入重定向符号是远小于号(<<)。除了这个符号你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可以作为文本标记,但是在数据的开始和结尾文本标记必须一样。
格式如下:
command << marker
data
marker
3、执行数学运算
在shell脚本中有两种途径执行数学运算。先介绍第一种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命令的输出。
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数学运算符只支持整数运算,若要进行任何实际的数学计算,这是一个较大的限制。
有几种方案能够克服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