SHELL脚本
shell脚本用途
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
[root@localhost ~]#cat /etc/shells 查看当前系统支持的shell
/bin/sh 已经被bash替换
/bin/bash 基于gun的框架下发展的shell
/sbin/nologin 一种特殊的shell让用户无法登录
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh 整合了csh提供了更多功能
/bin/csh 类似c语言的shell
三种处理逻辑
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)
重定向与管道操作
交互式硬件设备
| 类型 | 介绍 | 设备文件 | 文件描述编号 | 默认设备 |
|---|---|---|---|---|
| 标准输入 | 从该设备接收用户输入的数据 | /dev/stdin | 0 | 键盘 |
| 标准输出 | 通过该设备向用户输出数据 | /dev/stdout | 1 | 显示器 |
| 标准错误输出 | 通过该设备报告执行出错信息 | /dev/stderr | 2 | 显示器 |
重定向操作
| 类型 | 操作符 | 用途 |
|---|---|---|
| 重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
| 重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
| >> | 将输出结果追加到指定的文件尾部 | |
| 重定向错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
| 2>> | 将错误信息追加到指定的文件中 | |
| 混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中(覆盖原有内容) |
| &>> | 将标准输出、标准错误的内容追加到同一个文件中 | |
| 2>&1 | 将标准错误输出重定向到标准输出,即将标准错误输出当作标准输出和标准输出一起保存到同一个文件中 |
- 重定向输入
- 重定向输出
- 重定向错误输出
- 混合输出
管道操作
将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
如果管道符合右边是一定需要执行对象的命令,则管道符号后面要有 xargs 命令来传递执行参数。
实例
Shell脚本变量
变量的作用
-
用来存放系统和用户需要使用的特定参数
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
自定义变量
定义一个新的变量,变量名以字母或下划线开头,区分大小写,建议全大写。
bash
复制代码
#定义一个新的变量
变量名=变量值
#查看变量值
echo $变量名
补充
- 为防止出现歧义,建议变量名外加{}
- 如果想赋予的值中间有空格隔开,则需要加引号''或""
- ' ' 和 " " 的区别
read
作用:获取标准输入的内容给变量,只能赋予一行内容
运用在脚本中
echo -n:不换行输出
局部变量与全局变量
局部变量
局部变量只会在当前shell环境中有效。
- bash/sh运行脚本后,赋予给abc变量的值,在当前shell环境并不有效。
- 当前环境中的变量,切换shell环境后,输出为空。
全局变量
bash
复制代码
#临时设置全局变量,重启后消失
export 变量名=变量值
#局部变量改变成全局变量
export 变量名
全局变量对所有shell环境都有效。
局部变量改变成全局变量
系统中的全局变量
shell中整数变量运算
bash
复制代码
#变量运算方式
expr 数值或变量 运算符 数值或变量
$((数值 运算符 数值))
$[数值 运算符 数值]
let 变量=<数值>运算符<数值>
| 运算 | 符号 |
|---|---|
| 加法 | + |
| 减法 | - |
| 乘法 | \ * |
| 除法 | / |
| 取余 | % |
- expr
- [ ]
- let
小数的运算
bc
bash
复制代码
echo "浮点运算表达式" | bc
- 结果小数的位数由运算式中小数位最多的数确定。
- scale可指定小数位数。
awk
arduino
复制代码
awk 'BEGIN {print 浮点运算表达式}'
- awk计算小数,结果位数为六位有效数字。
特殊变量
环境变量
环境变量由系统提前创建,用来设置用户的工作环境。
使用env命令可以查看到当前工作环境下的环境变量
- USER表示用户名称
- HOME表示用户的宿主目录
- LANG表示语言和字符集
- PWD表示当前所在的工作目录
- PATH表示可执行程序的默认搜索路径
让自己创建的脚本文件全局可用
-
把脚本文件复制到PATH中的一个目录中,或者创建软链接到其中一个目录中
-
将脚本文件所在目录的绝对路径添加到PATH后,重启后失效
永久配置:
- /etc/profile中,最后添加PATH=$PATH:/data
- source /etc/profile执行
- 重启
- /etc/profile中,最后添加PATH=$PATH:/data
只读变量
赋予变量值后,只读变量不能删除修改。
临时配置的重启后失效。
永久配置:
在/etc/profile配置,删除配置后失效
位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
运用:计算两数之和
其中2为脚本后跟的第二个参数,计算两数和。
补充
19为脚本后跟的19个参数,从第十个参数开始需要加{}(例:${10})
预定义变量
- $0:脚本本身
- $#:脚本后面跟的参数个数
@不带引号
@:脚本后面跟的所有参数
@带引号
- "$*":会把脚本后面跟的所有参数当作一个整体看待
- "$@":会把脚本后面跟的所有参数看作多个以空格分隔的个体
$? 的作用
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于shell脚本中return退出函数并返回的退出值。
补充:date的使用
| 常用格式 | 作用 |
|---|---|
| %Y | 年份 |
| %m | 月份 1~12 |
| %d | 按月计的日期 |
| %F | 完整日期格式,等价于 %Y-%m-%d |
选项-d
显示时间由STRING描述
- 显示前一天
- 显示后一天
| 时间 | 表示 |
|---|---|
| 前一天 | -1 day |
| 后一天 | +1 day |
| 前一周 | -1 week |
| 后一周 | +1 week |
| 前一个月 | -1 month |
| 后一个月 | +1 month |
| 前一年 | -1 year |
| 后一年 | +1 yesr |
- 显示上个月最后一天
- 显示这个月最后一天
实操:打包多个文件
打包多个文件 运行结果