shell构建基本脚本(下)

1.4 重定向输入和输出

  • 输出重定向
    最基本的重定向将命令的输出发送到一个文件中。
    command > outputfile
[leo@orig-leo shell]$ date > test6
[leo@orig-leo shell]$ cat test6
20180102日 星期二 21:29:46 CST
[leo@orig-leo shell]$ who > test6
[leo@orig-leo shell]$ cat test6
leo      pts/0        2018-01-02 19:42 (:0)
leo      :0           2018-01-02 19:36 (:0)

>(大于号)定向输出会覆盖原来的文件
双大于号>>用于追加数据

[leo@orig-leo shell]$ date > test6
[leo@orig-leo shell]$ who >> test6
[leo@orig-leo shell]$ cat test6
20180102日 星期二 21:43:58 CST
leo      pts/0        2018-01-02 19:42 (:0)
leo      :0           2018-01-02 19:36 (:0)
  • 输入重定向
    输入重定向将文件的内容重定向到命令。command < inputfile
    wc命令可以对文本进行计数,默认输出三个值,文本的行数,单词数,字节数。
[leo@orig-leo shell]$ wc < test6
  3  16 131

另一种输入重定向方法称为内联输入重定向,符号是<<。除此之外,必须指明一个文本标记来划分输入数据的开始和结尾,任何字符串都可以作为文本标记,但必须一致。

command << marker(文本标记)
date
marker(文本标记)
[leo@orig-leo shell]$ wc << marker
> 1
> 2
> 3
> one
> two
> three
> marker
 6  6 20

1.5 管道

有时需要将一个命令的输出作为另一个命令的输入,用重定向实现。

[leo@orig-leo shell]$ rpm -qa > rpm.list
[leo@orig-leo shell]$ sort < rpm.list 
aalib-libs-1.4.0-0.22.rc5.el7.x86_64
abattis-cantarell-fonts-0.0.25-1.el7.noarch
abrt-2.1.11-48.el7.centos.x86_64
abrt-addon-ccpp-2.1.11-48.el7.centos.x86_64
abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64
abrt-addon-pstoreoops-2.1.11-48.el7.centos.x86_64
abrt-addon-python-2.1.11-48.el7.centos.x86_64
abrt-addon-vmcore-2.1.11-48.el7.centos.x86_64
abrt-addon-xorg-2.1.11-48.el7.centos.x86_64
abrt-cli-2.1.11-48.el7.centos.x86_64
abrt-console-notification-2.1.11-48.el7.centos.x86_64
abrt-dbus-2.1.11-48.el7.centos.x86_64
abrt-desktop-2.1.11-48.el7.centos.x86_64
abrt-gui-2.1.11-48.el7.centos.x86_64
abrt-gui-libs-2.1.11-48.el7.centos.x86_64
abrt-libs-2.1.11-48.el7.centos.x86_64
abrt-python-2.1.11-48.el7.centos.x86_64
abrt-retrace-client-2.1.11-48.el7.centos.x86_64
abrt-tui-2.1.11-48.el7.centos.x86_64
accountsservice-0.6.45-3.el7_4.1.x86_64
accountsservice-libs-0.6.45-3.el7_4.1.x86_64
acl-2.2.51-12.el7.x86_64
adcli-0.8.1-3.el7.x86_64
adwaita-cursor-theme-3.22.0-1.el7.noarch
adwaita-gtk2-theme-3.22.2-1.el7.x86_64
adwaita-icon-theme-3.22.0-1.el7.noarch
aic94xx-firmware-30-6.el7.noarch
alsa-firmware-1.0.28-2.el7.noarch
alsa-lib-1.1.3-3.el7.x86_64
alsa-plugins-pulseaudio-1.1.1-1.el7.x86_64
alsa-tools-firmware-1.1.0-1.el7.x86_64
alsa-utils-1.1.3-2.el7.x86_64
anaconda-core-21.48.22.121-1.el7.centos.x86_64
anaconda-tui-21.48.22.121-1.el7.centos.x86_64
anaconda-widgets-21.48.22.121-1.el7.centos.x86_64
appstream-data-7-20170301.el7.noarch
apr-1.4.8-3.el7_4.1.x86_64
apr-util-1.5.2-6.el7.x86_64
at-3.1.13-22.el7.x86_64
atk-2.22.0-3.el7.x86_64
atkmm-2.24.2-1.el7.x86_64
at-spi2-atk-2.22.0-2.el7.x86_64
at-spi2-core-2.22.0-1.el7.x86_64
attica-0.4.2-1.el7.x86_64
attr-2.4.46-12.el7.x86_64
audit-2.7.6-3.el7.x86_64
audit-libs-2.7.6-3.el7.x86_64
audit-libs-python-2.7.6-3.el7.x86_64
augeas-libs-1.4.0-2.el7_4.2.x86_64
authconfig-6.2.8-30.el7.x86_64
autoconf-2.69-11.el7.noarch
autocorr-en-5.0.6.2-14.el7.noarch
autocorr-zh-5.0.6.2-14.el7.noarch
autofs-5.0.7-70.el7_4.1.x86_64
autogen-libopts-5.18-5.el7.x86_64
automake-1.13.4-3.el7.noarch
avahi-0.6.31-17.el7.x86_64
avahi-glib-0.6.31-17.el7.x86_64
avahi-gobject-0.6.31-17.el7.x86_64
avahi-libs-0.6.31-17.el7.x86_64
avahi-ui-gtk3-0.6.31-17.el7.x86_64
baobab-3.22.1-1.el7.x86_64
basesystem-10.0-7.el7.centos.noarch
bash-4.2.46-29.el7_4.x86_64
bash-completion-2.1-6.el7.noarch
bc-1.06.95-13.el7.x86_64
bind-libs-9.9.4-51.el7_4.1.x86_64
bind-libs-lite-9.9.4-51.el7_4.1.x86_64
bind-license-9.9.4-51.el7_4.1.noarch
bind-utils-9.9.4-51.el7_4.1.x86_64
binutils-2.25.1-32.base.el7_4.1.x86_64
biosdevname-0.7.2-2.el7.x86_64
bison-3.0.4-1.el7.x86_64
blktrace-1.0.5-8.el7.x86_64
bluez-5.44-4.el7_4.x86_64
bluez-libs-5.44-4.el7_4.x86_64
boost-date-time-1.53.0-27.el7.x86_64
boost-iostreams-1.53.0-27.el7.x86_64
boost-system-1.53.0-27.el7.x86_64
boost-thread-1.53.0-27.el7.x86_64
brasero-3.12.1-2.el7.x86_64
brasero-libs-3.12.1-2.el7.x86_64
brasero-nautilus-3.12.1-2.el7.x86_64
bridge-utils-1.5-9.el7.x86_64
brlapi-0.6.0-15.el7.x86_64
brltty-4.5-15.el7.x86_64
btrfs-progs-4.9.1-1.el7.x86_64
byacc-1.9.20130304-3.el7.x86_64
bzip2-1.0.6-13.el7.x86_64
bzip2-libs-1.0.6-13.el7.x86_64
ca-certificates-2017.2.14-71.el7.noarch
cairo-1.14.8-2.el7.x86_64
cairo-gobject-1.14.8-2.el7.x86_64
cairomm-1.12.0-1.el7.x86_64
c-ares-1.10.0-3.el7.x86_64
caribou-0.4.21-1.el7.x86_64
caribou-gtk2-module-0.4.21-1.el7.x86_64
caribou-gtk3-module-0.4.21-1.el7.x86_64
cdparanoia-10.2-17.el7.x86_64
cdparanoia-libs-10.2-17.el7.x86_64
cdrdao-1.2.3-20.el7.x86_64
celt051-0.5.1.3-8.el7.x86_64
centos-indexhtml-7-9.el7.centos.noarch
centos-logos-70.0.6-3.el7.centos.noarch
centos-release-7-4.1708.el7.centos.x86_64
[...]

重定向需要将结果输出到文件,在从文件重定向输入到命令,比较繁琐,中间有文件生产。我们用不着将命令输出重定向到文件中,可以将其直接重定向到另一个命令,这个过程叫做管道连接

command1 | command2 | ...

命令1与命令2同时执行,命令1输出会立即送到命令2,数据传输不会用到任何中间文件或缓冲区。

[leo@orig-leo shell]$ rpm -qa | sort 
aalib-libs-1.4.0-0.22.rc5.el7.x86_64
abattis-cantarell-fonts-0.0.25-1.el7.noarch
abrt-2.1.11-48.el7.centos.x86_64
abrt-addon-ccpp-2.1.11-48.el7.centos.x86_64
abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64
abrt-addon-pstoreoops-2.1.11-48.el7.centos.x86_64
abrt-addon-python-2.1.11-48.el7.centos.x86_64
abrt-addon-vmcore-2.1.11-48.el7.centos.x86_64
abrt-addon-xorg-2.1.11-48.el7.centos.x86_64
abrt-cli-2.1.11-48.el7.centos.x86_64
abrt-console-notification-2.1.11-48.el7.centos.x86_64
abrt-dbus-2.1.11-48.el7.centos.x86_64
abrt-desktop-2.1.11-48.el7.centos.x86_64
abrt-gui-2.1.11-48.el7.centos.x86_64
abrt-gui-libs-2.1.11-48.el7.centos.x86_64
abrt-libs-2.1.11-48.el7.centos.x86_64
abrt-python-2.1.11-48.el7.centos.x86_64
abrt-retrace-client-2.1.11-48.el7.centos.x86_64
abrt-tui-2.1.11-48.el7.centos.x86_64
accountsservice-0.6.45-3.el7_4.1.x86_64
accountsservice-libs-0.6.45-3.el7_4.1.x86_64
acl-2.2.51-12.el7.x86_64
adcli-0.8.1-3.el7.x86_64
adwaita-cursor-theme-3.22.0-1.el7.noarch
adwaita-gtk2-theme-3.22.2-1.el7.x86_64
adwaita-icon-theme-3.22.0-1.el7.noarch
aic94xx-firmware-30-6.el7.noarch
alsa-firmware-1.0.28-2.el7.noarch
alsa-lib-1.1.3-3.el7.x86_64
alsa-plugins-pulseaudio-1.1.1-1.el7.x86_64
alsa-tools-firmware-1.1.0-1.el7.x86_64
alsa-utils-1.1.3-2.el7.x86_64
anaconda-core-21.48.22.121-1.el7.centos.x86_64
anaconda-tui-21.48.22.121-1.el7.centos.x86_64
anaconda-widgets-21.48.22.121-1.el7.centos.x86_64
appstream-data-7-20170301.el7.noarch
apr-1.4.8-3.el7_4.1.x86_64
apr-util-1.5.2-6.el7.x86_64
at-3.1.13-22.el7.x86_64
atk-2.22.0-3.el7.x86_64
atkmm-2.24.2-1.el7.x86_64
at-spi2-atk-2.22.0-2.el7.x86_64
at-spi2-core-2.22.0-1.el7.x86_64
attica-0.4.2-1.el7.x86_64
attr-2.4.46-12.el7.x86_64
audit-2.7.6-3.el7.x86_64
audit-libs-2.7.6-3.el7.x86_64
audit-libs-python-2.7.6-3.el7.x86_64
augeas-libs-1.4.0-2.el7_4.2.x86_64
authconfig-6.2.8-30.el7.x86_64
autoconf-2.69-11.el7.noarch
autocorr-en-5.0.6.2-14.el7.noarch
autocorr-zh-5.0.6.2-14.el7.noarch
autofs-5.0.7-70.el7_4.1.x86_64
autogen-libopts-5.18-5.el7.x86_64
automake-1.13.4-3.el7.noarch
avahi-0.6.31-17.el7.x86_64
avahi-glib-0.6.31-17.el7.x86_64
avahi-gobject-0.6.31-17.el7.x86_64
avahi-libs-0.6.31-17.el7.x86_64
avahi-ui-gtk3-0.6.31-17.el7.x86_64
baobab-3.22.1-1.el7.x86_64
basesystem-10.0-7.el7.centos.noarch
bash-4.2.46-29.el7_4.x86_64
bash-completion-2.1-6.el7.noarch
bc-1.06.95-13.el7.x86_64
bind-libs-9.9.4-51.el7_4.1.x86_64
bind-libs-lite-9.9.4-51.el7_4.1.x86_64
bind-license-9.9.4-51.el7_4.1.noarch
bind-utils-9.9.4-51.el7_4.1.x86_64
binutils-2.25.1-32.base.el7_4.1.x86_64
biosdevname-0.7.2-2.el7.x86_64
bison-3.0.4-1.el7.x86_64
blktrace-1.0.5-8.el7.x86_64
bluez-5.44-4.el7_4.x86_64
bluez-libs-5.44-4.el7_4.x86_64
boost-date-time-1.53.0-27.el7.x86_64
boost-iostreams-1.53.0-27.el7.x86_64
boost-system-1.53.0-27.el7.x86_64
boost-thread-1.53.0-27.el7.x86_64
brasero-3.12.1-2.el7.x86_64
brasero-libs-3.12.1-2.el7.x86_64
brasero-nautilus-3.12.1-2.el7.x86_64
bridge-utils-1.5-9.el7.x86_64
brlapi-0.6.0-15.el7.x86_64
brltty-4.5-15.el7.x86_64
btrfs-progs-4.9.1-1.el7.x86_64
byacc-1.9.20130304-3.el7.x86_64
bzip2-1.0.6-13.el7.x86_64
bzip2-libs-1.0.6-13.el7.x86_64
ca-certificates-2017.2.14-71.el7.noarch
cairo-1.14.8-2.el7.x86_64
cairo-gobject-1.14.8-2.el7.x86_64
cairomm-1.12.0-1.el7.x86_64
c-ares-1.10.0-3.el7.x86_64
caribou-0.4.21-1.el7.x86_64
caribou-gtk2-module-0.4.21-1.el7.x86_64
caribou-gtk3-module-0.4.21-1.el7.x86_64
cdparanoia-10.2-17.el7.x86_64
cdparanoia-libs-10.2-17.el7.x86_64
cdrdao-1.2.3-20.el7.x86_64
celt051-0.5.1.3-8.el7.x86_64
centos-indexhtml-7-9.el7.centos.noarch
centos-logos-70.0.6-3.el7.centos.noarch
centos-release-7-4.1708.el7.centos.x86_64
certmonger-0.78.4-3.el7.x86_64
cgdcbxd-1.0.2-7.el7.x86_64
checkpolicy-2.5-4.el7.x86_64
[...]

1.6 执行数学运算

  • expr(expression表达式)

注意:运算符两边有空格

[leo@orig-leo ~]$ expr 5 * 2
expr: 语法错误
[leo@orig-leo ~]$ expr 5 \* 2
10

转义字符\将shell不易识别的*号转义为乘号。
脚本中使用expr命令

[leo@orig-leo shell]$ vi test6
#!/bin/bash
#An example of using the expr command
var1=10
var2=20
var3=$(expr $var2 / $var1)
echo The result is $var3
[leo@orig-leo shell]$ chmod u+x test6
[leo@orig-leo shell]$ ./test6
The result is 2
  • 使用方括号[]
    在bash中,在将一个数学运算结果赋值给某个变量时,可以用$和[]将数学表达式为起来。
[leo@orig-leo shell]$ vi test7
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - var3)]
echo The final result is $var4
[leo@orig-leo shell]$ chmod u+x test7
[leo@orig-leo shell]$ ./test7
The final result is 500

bash shell数学运算符只支持整数。

[leo@orig-leo shell]$ vi test8
#!/bin/bash
var1=100
var2=45
var3=$[$var1 / $var2]
echo The final result is $var3
[leo@orig-leo shell]$ chmod u+x test8
[leo@orig-leo shell]$ ./test8
The final result is 2
  • 浮点解决方案
    最常见的方案是用内建的bash计算器,叫做bc。
    1、bc的基本用法
    bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,解释计算该表达式,最后返回结果。bash计算器能够识别:
    ——数字(整数和浮点数)
    ——变量(简单变量和数组)
    ——注释(以#或C语言/* */开始的行)
    ——表达式
    ——编程语句(例如if-then语句)
    ——函数
    在shell下通过ba命令访问bash计算器,quit退出bc
[leo@orig-leo shell]$ 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'. 
100 +  200
300
100 - 200
-100
10 * 10
100
100 / 45
2
quit
[leo@orig-leo shell]$ 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.3 * 3.3
40.5
12.30 * 3.30
40.59
quit

浮点运算是由内建变量sale控制的,用scale = 数字,设置保留小数点位数。scale默认值为0,即默认结果只显示整数。-q命令选项可以不显示bc的欢迎信息。

[leo@orig-leo shell]$ bc -q
3.44 / 5
0
scale =  4  #保留4位小数点
3.44 / 5
.6880
quit

除了普通数字,bc还支持变量

[leo@orig-leo shell]$ bc -q
var1=10
var1 * 4
40
var2 = var1 / 5
print var2
2
quit

2、在脚本中使用bc
在脚本中使用bc要用到通道这一知识,格式为:

variables = $(echo "options;expression" | bc)
[leo@orig-leo shell]$ vi test9
#!/bin/bash
var1=$(echo "scale = 4;3.44 / 5" | bc)
echo The answer is $var1
[leo@orig-leo shell]$ chmod u+x test9
[leo@orig-leo shell]$ ./test9
The answer is .6880
[leo@orig-leo shell]$ vi test10
#!/bin/bash
var1=100
var2=45
var3=$(echo "scale = 4; $var1 / $var2" | bc)
echo The answer for this is $var3
[leo@orig-leo shell]$ chmod u+x test10
[leo@orig-leo shell]$ ./test10
The answer for this is 2.2222
[leo@orig-leo shell]$ vi test11
#!/bin/bash
var1=20
var2=3.14159
var3=$(echo "scale = 4; $var1 * $var1" | bc)
var4=$(echo "scale = 4; $var3 * $var2" | bc)
echo The answer for this is $var4
[leo@orig-leo shell]$ chmod u+x test11
[leo@orig-leo shell]$ ./test11
The answer for this is 1256.63600
[leo@orig-leo shell]$ vi test12
#!/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 final answer for this mess is $var5

[leo@orig-leo shell]$ chmod u+x test12
[leo@orig-leo shell]$ ./test12
The final answer for this mess is 2813.9882
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值