在一些复杂的Linux维护中,大量重复性的输入和交互操作不但费时费力,而且还容易出错,而编写一个恰到好处的shell脚本程序,可以批量的处理,自动化完成一系列维护的任务,大大减少了管理员的负担。
一、编写第一个shell脚本。
Linux系统中的shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个命令解释器的角色,负责接收用户输入的操作指令,并进行解释,将需要执行的操作传递给内核执行,并输出结果。常见的shell解释器程序有很多种,使用不同的shell脚本时,其内部命令,命令行提示方面会存在一些区别。通过/etc/shells文件可以了解当前系统支持的shell脚本的种类。
[root@shell-yankerp~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
其中/bin/bash是目前最大多数linux版本采用的默认shell脚本。Bash是受欢迎的开源软件项目之一。
2、什么是shell脚本呢?
简单的说只要将平时使用的各种linux命令按顺序保存到一个文本文件中,然后添加执行权限,这个文件就成为了一个shell脚本了。例如以下操作创建第一个脚本文件:first.sh
[root@shell-yankerp ~]# vi first.sh //新建first.sh文件
cd /boot/
pwd
ls -lh vml*
ifconfig
[root@shell-yankerp~]# chmod +x first.sh //添加可执行权限
[root@shell-yankerp ~]# ./first.sh //直接运行脚本文件
/boot
-rwxr-xr-x. 1 root root 5.2M 9月 9 05:12vmlinuz-0-rescue-03fd14e2dcad46dbbad318f74d8a6fcc
-rwxr-xr-x. 1 root root 5.2M 11月 23 2016vmlinuz-3.10.0-514.el7.x86_64
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.64.129 netmask 255.255.255.0 broadcast 192.168.64.255
inet6fe80::4b23:d428:1f1c:22de prefixlen64 scopeid 0x20<link>
ether00:0c:29:65:55:03 txqueuelen 1000 (Ethernet)
RX packets 280526 bytes 419138906 (399.7 MiB)
RX errors 0 dropped 0overruns 0 frame 0
TX packets 98631 bytes 5991953 (5.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128scopeid 0x10<host>
loop txqueuelen 1(Local Loopback)
RX packets 204 bytes 17724 (17.3 KiB)
RX errors 0 dropped 0overruns 0 frame 0
TX packets 204 bytes 17724 (17.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0collisions 0
virbr0: flags=4099<UP,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether52:54:00:49:dc:e2 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0collisions 0
3、一个合格的shell脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更加容易读懂,对于代码较多,结构复杂的脚本,应添加必要的注释文字,改写后的first.shell如下:
[root@shell-yankerp ~]# cat first.sh
#!/bin/bash
# This is my yankerp
cd /boot
echo "当前目录位于:"
pwd
ls -lh vml*
[root@shell-yankerp ~]# ./first.sh
当前目录位于:
/boot
-rwxr-xr-x. 1 root root 5.2M 9月 9 05:12 vmlinuz-0-rescue-03fd14e2dcad46dbbad318f74d8a6fcc
-rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64
直接通过./first.sh的方式执行脚本,要求文件本身具有X权限的,在某先安装系统中可能无法满足此条件,linux操作系统还提供了执行shell脚本的其他方式,使用"sh first.sh"或". first.sh"脚本的语句
二、重定向与管道操作
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用">"或">>"操作符号,分别用于覆盖和追加文件。例如:我们要把uname -r 的输出结果到yanker.txt中
[root@shell-yankerp boot]# uname -r > yanker.txt
[root@shell-yankerp boot]# cat yanker.txt
3.10.0-514.el7.x86_64
当需要保存目标文件原有的内容时,应改用">>"符号,这个的意思就是追加。而不是覆盖。例如:我们把ifconfig的输出结果追加到yanker.txt中,之前的文件还是有的 只不过就是追加到后面了,很简单。
2)重定向输入
重定向输入指的是将命令中接受输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用"<"操作符例如:使用passwd命令为用户设置密码时,每次都必须提示输入两次密码,有点烦琐,若改用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合passwd命令的"--stdin"选项来识别标准的输入)
[root@shell-yankerp boot]# vi pass.txt //添加初始密码:123456 !!!创建用户zhangsan
[root@shell-yankerp boot]# passwd --stdin zhangsan < pass.txt
很简单,简单的说:在执行的命令出现错误信息,保存到指定的文件,而不是显示在屏幕上。错误的重定向使用"2>"其中的2是指错误文件编号。例如:我们随便写个错误的命令,让他输出到错误日志然后我们查看错误日志信息。
[root@shell-yankerp boot]# cd /root/jhekjdhekhfk 2> error.log
[root@shell-yankerp boot]# cat error.log
-bash: cd: /root/jhekjdhekhfk: 没有那个文件或目录
使用"2>"操作符时,会想使用">"操作符一样覆盖目标文件的内容这时候如果要追加内容而不是覆盖内容可以使用"2>>"来追加。这里我就不做演示了。
2、管道操作
root:x:0:0:root:/root:/bin/bash
yankai:x:1000:1000:yankai:/home/yankai:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash