一、shell脚本编程
1.1、编程语言排名
https://www.tiobe.com/tiobe-index/
1.2、什么是shell
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。
这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
1.3、shell的作用
Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
cat /etc/shells
/bin/sh #是bash命令的软链接 (已经被/bin/bash所替换)
/bin/bash 基准于GNU的框架下发展出的Shell。
/usr/bin/sh 已经被bash所替换。
/usr/bin/bash #centos和redhat系统默认使用bash shell
/bin/tcsh #csh的增强版,与csh完全兼容 整合了csh,提供更多的功能。
/bin/csh #已经被/bin/bash 所替换 (整合C shell,提供更多的功能)
注:nologin:奇怪的shell,这个shell可以让用户无法登录主机。
bash ( /bin/bash)是目前大多数Linux版本采用的默认Shell。
1.4、关于shell的一些问题
1.4.1、为什么我们的系统上合法的shell要写入/etc/shells这个文件?
这是因为系统某些服务在运行过程中,会去检查用户能够使用的shells,而这些shell的查询就是借由/etc/shells这个文件。
1.4.2、用户什么时候可以取得shell来工作?还有我这个默认会取得哪一个shell?
当我登录的时候,系统就会给我shell让我来工作,而这个登录取得的shell就记录在/etc/passwd这个文件内。
不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,
流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途目前大多数linux系统默认使用的是bash shell,默认登陆shell是/bin/bash,可以查看/etc/passwd文件里注明
这个shell是针对用户而言的,可以查看/etc/passwd里面的最后的字段使用的是哪个shell,如果想要修改可以用chmod -s或者chsh -s来重新指定
1.4.3、shell脚本能干什么
自动化完成软件的安装部署,如安装部署LAMP架构服务
自动化完成系统的管理,如批量添加用户
自动化完成备份,如数据库定时备份
自动化的分析处理,如网站访问量
1.4.4、shell脚本使用场景
在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率
1.4.5、如何学习shell脚本
熟悉掌握各种linux命令
掌握脚本的标准格式
掌握脚本的基本语法
1.5、shell脚本的构成
第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
可执行语句:如echo命令,用于输出“ ”之间的字符串
1.6、shell初入门
1.6.1、创建 shell 程序的步骤:
第一步:创建一个包含命令和控制结构的文件。
第二步:修改这个文件的权限使它可以执行 # 使用 chmod +x test.sh
第三步:检测语法错误
第四步:执行 ./first.sh
1.6.2、shell脚本执行
shell 脚本的执行通常有以下几种方式
- 方法一:当前路径(决定路径与相对路径)下执行脚本(要有执行权限)
/home/first.sh 或者 ./first.sh
- 方法二:sh 、bash脚本文件路劲(这种方式可以不对脚本文件添加执行权限)
bash first.sh 或 sh first.sh
- 方法三:source 脚本文件路劲(可以没有执行权限)
source first.sh
- 方法四:其他方法
sh < first.sh 或者 cat first.sh |sh(bash)
1.6.3、案例
vim first.sh
#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*
二、重定向与管道操作
2.1、重定向
重定向的意思就是 ,不输出到默认设备上,输出到指定的位置(文件 其他输出设备)
用户通过操作系统处理信息的过程中,包括以下几类交互设备文件
标准输入(STDIN):默认的设备是键盘,设备文件/dev/stdin,文件编号为 0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,设备文件/dev/stdout,文件编号为 1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,设备文件/dev/stderr 文件编号为 2,命令将执行期间的各种错误信息发送到标准错误文件。
从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。
交互式硬件设别
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2.1.1、重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件。
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。
2.1.1.1、实验
- >意思是当原来文件中有内容的话,原来的内容会被覆盖掉
- >>意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容
2.1.2、重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待 从键盘输入。重定向输入使用“<”操作符。 通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。
例如,使用 passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改 用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的“--stdin” 选项来识别标准输入)。
2.1.2.1、实验
#添加初始密码串内容"123456" 123456
vim pass.txt
#从pass.txt读入密码给paswd命令而不是等待用户从键盘输入123456
passwd --stdin jk < pass.txt
2.1.2.2、探讨
系统默认以键盘为输入设备,需要我们输入东西,然后读取
跟cat 1.txt 结果是一样的,但是这是以1.txt文件作为输入设备了
默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台。
cat <<0 以0作为分界符,只要不输入0就会一直输入数据从而显示到屏幕
单个<不行
可以把输入重定向和输出重定向结合使用,把从屏幕输出的内容保存到文件
2.1.4、错误重定向
属于重定向输出的一种情况
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符。
作用:
- 在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据,还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁
使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类 输出信息保存到同一个文件
/dev/null 把它看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到, /dev/null 对命令行和脚本都非常的有用
echo blackhole> /dev/null
cat /dev/null 什么信息也看不到
2.1.4.1、&>和>&符号
&表示等同于的意思
把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出
本来标准输出不可以输出,但是我现在等同于错误了
ls /tmp xxxx >1.txt 2>&1
2>&1 把标准错误重定向到标准输出
看图好理解
ls /tmp xxxx 2>2.txt 1>&2
如果是1>&2
再写>file.txt,&2代表前面错误的文件,显示,然后1的内容保存
画图理解
如果你先写2>&1
再写>999.txt
,那么标准错误会被重定向到当前的标准输出位置,显示了
但随后标准输出被重定向到999.txt
&> 是将标准输出、标准错误的内容保存到同一个文件中
2.1.4.2、实验1
例 1: 将错误显示的内容和正确显示的内容分开
注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符
2.1.4.2、实验2
在编译源码包的自动化脚本中,若要忽略 make、make install 等操作过程信息,则可以将其定向到空文件/dev/null。
#!/bin/bash # 自动编译安装 httpd 服务器的脚本
cd /usr/src/httpd-2.4.25/./configure --prefix=/usr/local/httpd --enable-so &> /dev/null
make &> /dev/null
make install &> /dev/null #/dev/null等同于make install > /dev/null 2>&1
2.2、管道操作
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“ | ”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
简单的说:
- 管道(pipe)符号用于将一个命令的输出作为另一个命令的输入。
在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
$bash
bash是shell的一种,是linux下最常用的一种shell
$bash的意思是执行一个子shell,此子shell为bash。
$表示系统提示符,$ 表示此用户为普通用户,超级用户的提示符是#,
2.2.1、实验1
grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
2.2.2、实验2
df -hT | grep "/$" | awk '{print $6}'
"/$"
是一个正则表达式,用于匹配以/
结尾的行。在df
命令的输出中,根文件系统的挂载点就是/
,所以这个表达式用于筛选出根文件系统的行。(^是开头)
总结:
重定向与管道操作是 Shell 环境中十分常用的功能,若能够熟练掌握并灵活运用,将有助于编写代码简洁但功能强大的 Shell 脚本程序