一、Shell脚本基础
ASP站长网Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作命令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1、简单编写Shell脚本
[root@CentOS01 ~]# vim aaa.sh <!--新建aaa.sh文件-->
#!/bin/bash
#Description E-Mail:2807489749@qq.com BY:LYX
cd /boot/
echo "显示当前目录:"
pwd
echo "查看以vml开头的文件:"
ls -lh vml*
[root@centos01 ~]# chmod +x aaa.sh <!--添加可执行权限-->
上述aaa.sh脚本文件中,第一行“#!/bin/bash”是一行特殊的脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行;其他以“#”开头的语句表示注释信息;echo命令用于输出字符串,以使脚本的输出信息更容易读懂。上述配置包括三条命令:cd /boot/、pwd、ls -lh vml*。执行此脚本文件后,输出结果与依次单独执行这三条命令是相同的,从而实现了“批量处理”的自动化过程。
通过“./aaa.sh”的方式执行脚本,执行之前必须授权于文件的X权限。
[root@centos01 ~]# ./aaa.sh <!--运行脚本文件-->
/boot
-rwxr-xr-x. 1 root root 5.7M 10月 23 22:35 vmlinuz-0-rescue-2b580d1a2e8348b8aa9f78be11137b41
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@centos01 ~]# source aaa.sh <!--通过source来解释脚本-->
[root@centos01 ~]# sh aaa.sh <!--通过/bin/sh来解释脚本-->
二、重定向与管道操作
1、重定向输出
表示将命令的正常输出结果保存到指定的文件中,并覆盖文件中的原有内容,若文件不存在,则会新建一个文件使用 “>”操作符号。
表示将命令的正常输出结果追加到指定的文件中sh使用“>>”操作符号。
举个例子:
[root@centos01 ~]# echo "aaa" <!--数据输出到显示器上显示-->
aaa
[root@centos01 ~]# echo "aaa" > 1.txt <!--将数据输出到文件中-->
[root@centos01 ~]# cat 1.txt <!--查看文件中数据-->
aaa
[root@centos01 ~]# echo "bbb" >> 1.txt <!--将数据追加输出到1.txt文件中-->
[root@centos01 ~]# cat 1.txt <!--查看文件-->
aaa
bbb
2、重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。
举个例子:
使用passwd命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常繁琐,若改用重定向输入将可以省略交互式的过程,而自动完成密码设置。
[root@centos01 ~]# useradd bob <!--创建bob用户-->
[root@centos01 ~]# vim password.txt <!--添加初始密码串-->
pwd@123 <!--密码为pwd@123-->
[root@centos01 ~]# passwd --stdin bob < password.txt <!--从password.txt文件中取密码-->
更改用户 bob 的密码 。
passwd:所有的身份验证令牌已经成功更新。
3、错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用 “2>”操作符,其中“2”是指错误文件的编号(在使用标准输出、标准输入重定向时,实际上省略了1、0编号)。
举个例子:
执行以下操作可以将使用tar命令进行备份时出现的错误信息保存到3.txt文件中。
[root@centos01 ~]# tar jcf /nonedir/etc.tgz /etc/ 2> 3.txt
[root@centos01 ~]#
[root@centos01 ~]# cat 3.txt
tar: 从成员名中删除开头的“/”
tar (child): /nonedir/etc.tgz:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符。
当命令输出的结果可能即包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>” “2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符两两类输出信息保存到同一个文件。
举个例子:
[root@centos01 ~]# vim httpd.sh <!--新建httpd.sh文件-->
#!/bin/bash
#自动编译安装httpd服务器
cd /usr/src/httpd-2.2.17/
echo "1.配置Apache服务:"
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &> /dev/null
echo "2.编译Apache服务:"
make &> /dev/null
echo "3.安装Apache服务:"
make install &> /dev/null
[root@centos01 ~]# chmod +x httpd.sh <!--添加X权限-->
[root@centos01 ~]# ./httpd.sh <!--运行脚本文件-->
1.配置Apache服务:
2.编译Apache服务:
3.安装Apache服务:
4、管道操作
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
举个例子:
[root@centos01 ~]# grep "/bin/bash$" /etc/passwd <!--提取前-->
root:x:0:0:root:/root:/bin/bash
test:x:1000:1000:test:/home/test:/bin/bash
bob:x:1002:1002::/home/bob:/bin/bash
[root@centos01 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}' <!--提取后-->
root /bin/bash
test /bin/bash
bob /bin/bash
[root@centos01 ~]# df -hT <!--提取之前-->
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda3 xfs 76G 5.2G 71G 7% /
devtmpfs devtmpfs 474M 0 474M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 6.9M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 xfs 197M 136M 61M 70% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/sr0 iso9660 664M 664M 0 100% /mnt
[root@centos01 ~]# df -hT | grep "/$" |awk '{print $6}' <!--提取之后其中grep “/$”表示提取以“/”结尾的行-->
7%
上述中awk命令的作用是以冒号“:”作为分隔,输出第1个,第7个区域的字符串。其中的“-F”部分用来指定分割符号(未指定时,默认以空格或制表符分隔)。