shell脚本基本应用
在一些复杂的Linux维护中,大量重复性的输入和交互操作不但费时费力,而且还容易出错,而编写一个恰到好处的shell脚本程序,可以批量的处理,自动化完成一系列维护的任务,大大减少了管理员的负担。
一、 编写第一个shell脚本。
Linux系统中的shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个命令解释器的角色,负责接收用户输入的操作指令,并进行解释,将需要执行的操作传递给内核执行,并输出结果。常见的shell解释器程序有很多种,使用不同的shell脚本时,其内部命令,命令行提示方面会存在一些区别。通过/etc/shells文件可以了解当前系统支持的shell脚本的种类。
[[email protected]~]# 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
[[email protected] ~]# vi first.sh //新建first.sh文件
cd /boot/
pwd
ls -lh vml*
ifconfig
[[email protected]~]# chmod +x first.sh //添加可执行权限
[[email protected] ~]# ./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 0 overruns 0 frame 0
TX packets 98631 bytes 5991953 (5.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 204 bytes 17724 (17.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 204 bytes 17724 (17.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,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 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3、一个合格的shell脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更加容易读懂,对于代码较多,结构复杂的脚本,应添加必要的注释文字,改写后的first.shell如下:
[[email protected] ~]# cat first.sh
#!/bin/bash
# This is my yankerp
cd /boot
echo "当前目录位于:"
pwd
ls -lh vml*
[[email protected] ~]# ./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"脚本的语句
二、重定向与管道操作
1)重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用">"或">>"操作符号,分别用于覆盖和追加文件。例如:我们要把uname -r 的输出结果到yanker.txt中
[[email protected] boot]# uname -r > yanker.txt
[[email protected] boot]# cat yanker.txt
3.10.0-514.el7.x86_64
当需要保存目标文件原有的内容时,应改用">>"符号,这个的意思就是追加。而不是覆盖。例如:我们把ifconfig的输出结果追加到yanker.txt中,之前的文件还是有的 只不过就是追加到后面了,很简单。
2)重定向输入
重定向输入指的是将命令中接受输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用"<"操作符例如:使用passwd命令为用户设置密码时,每次都必须提示输入两次密码,有点烦琐,若改用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合passwd命令的"--stdin"选项来识别标准的输入)
[[email protected] boot]# vi pass.txt //添加初始密码:123456 !!!创建用户zhangsan
[[email protected] boot]# passwd --stdin zhangsan < pass.txt
3)错误重定向
很简单,简单的说:在执行的命令出现错误信息,保存到指定的文件,而不是显示在屏幕上。错误的重定向使用"2>"其中的2是指错误文件编号。例如:我们随便写个错误的命令,让他输出到错误日志然后我们查看错误日志信息。
[[email protected] boot]# cd /root/jhekjdhekhfk 2> error.log
[[email protected] boot]# cat error.log
-bash: cd: /root/jhekjdhekhfk: 没有那个文件或目录
使用"2>"操作符时,会想使用">"操作符一样覆盖目标文件的内容这时候如果要追加内容而不是覆盖内容可以使用"2>>"来追加。这里我就不做演示了。
2、管道操作
管道操作为不同命令之间的协同工作提供了一个机制位于管道符号|左侧的命令输出的结果将作为右侧命令的输出在同一航命令中可以使用多个管道
在shell脚本应用中管道操作通常用来过滤所有需要关键的信息例如使用grep命令来查询/bin/bash作为shell的用户名时会输出符合条件的整行内容在此基础上可以结合管道操作与awk命令做一步过滤,只输出用户名和登录shell列
[[email protected] boot]# grep "/bin/bash$" /etc/passwd
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
三、使用shell变量
1)自定义变量是系统用户自己定义的变量,不像很多高级编程语言那么复杂。在定义一个新变量时,一般不需要提前声明,而是直接指定变量的名称并赋予给初始值即可。其实很简单。例:
当变量名称容易和紧跟其后的其他字符混淆时,我们可以用{}来解决。例如:
2)双引号("")
双引号主要起字符串的作用,特别是当要赋值的内容包含空格时。例如:
后续继续更新,谢谢观看。