一、shell脚本基础概念
1、什么是shell
shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括ls、cd、pwd等等。
shell是站在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。
2、什么是shell脚本
shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
3、shell脚本的意义
- 自动化完成软件的安装部署,如安装部署LAMP架构服务
- 自动化完成系统的管理,如批量添加用户
- 自动化完成备份,如数据库定时备份
- 自动化的分析处理,如网站访问量
二、创建一个简单的shell脚本
1、创建shell脚本的步骤
- 创建一个包含命令和控制结构的文件
- 修改这个文件的权限使它可以执行
- 使用 chmod +x aaa.sh赋予脚本可执行权限
- 检测语法错误
- 执行 ./aaa.sh
2、脚本的初步编写
- 脚本以#!/bin/bash开头
- 脚本需要有可执行的权限
如:创建一个shell脚本,输出“hey boy”
#!/bin/bash
echo "hey boy"
执行方式:
- 输入脚本的绝对路径或相对路径(此方法要赋予该脚本可执行权限),如./hey.sh 或/home/hey.sh
- sh或bash + 脚本名,可以直接执行
3、脚本错误调试
脚本错误类型:
- 命令错误:命令错误不会影响接下来的命令,之后的命令会继续执行。
- 语法错误:会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
- 逻辑错误:执行后的效果不是自己想要的。需要自己去排查
调试方法:
bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确
bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误
三、重定向与管道符
由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。
1、交互式硬件设备
类型 | 设备文件 | 文件描述符 | 默认情况 | 对应文件句柄位置 |
标准输入 | /dev/stdin | 0 | 从键盘获得输入 | /proc/self/fd/0 |
标准输出 | /dev/stdout | 1 | 输出到屏幕 | /proc/self/fd/1 |
错误输出 | /dev/stderr | 2 | 输出到屏幕 | /proc/self/fd/2 |
- 标准输入:从该设备接收用户输入数据。
- 标准输出:通过该设备想用户输出数据。
- 标准错误:通过该设备报告执行出错信息。
2、重定向操作
重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。
输入重定向:
符号 | 作用 |
命令 < 文件 | 从指定的文件读取文件,而不是从键盘输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1 作为命令的标准输入并将标准输出到文件2 |
输出重定向:
符号 | 作用 |
命令 > 文件 | 将标准输出结果保存到指定的文件中(覆盖原有内容) |
命令 >> 文件 | 将标准输出结果追加到指定的文件尾部 |
命令 2> 文件 | 将错误输出信息保存到指定文件中(覆盖原有内容) |
命令 2>> 文件 | 将错误输出信息追加到指定文件尾部 |
命令 > 文件 2>&1 | 混合输出,将标准输出与错误输出保存到文同一个文件中 |
命令 2> 文件 1>&2 | 同上 |
命令 &> 文件 | 同上 |
命令 >& 文件 | 同上 |
- &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
- 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。
示例:
1) 将“114514”重定向输出到 1.txt 文件中,之后再用 1.txt 文件中的内容给用户week设置密码(如果出现鉴定令牌操作错误需要输入setenforce 0关闭selinux)
2)将“aaa"重定向输出到 tt.txt 文件中,之后将“bbb" 输出到 tt.txt 文件中,覆盖原有的”aaa";最后将“ccc"追加到 tt.txt 文件中
3)使用分界符进行输入重定向
4)将错误输出重定向到log文件中
3、管道符
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。linux下的管道符使用"|"表示。
格式:命令A | 命令B