shell脚本
shell脚本基础
shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。
查看本机shell信息: cat /etc/shells
shell脚本用途
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
shell脚本构成
- 将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用绝对路径
- 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本
- 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
- 注释信息:以#开头的语句表示为注释信息
- 可执行语句:比如echo命令用于输出“ ”之间的字符串
脚本执行逻辑与执行方式
脚本执行逻辑:
-
顺序执行:程序按从上到下顺序执行
-
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句
执行方式
- 指定路径去执行文件(需要有执行权限)
- 指定解释器去执行(不需要权限)
ps:指定了使用 bash去执行脚本不需要权限
添加执行权限
将文件放在系统文件下
$PATH //查看系统文件
cp [脚本文件] [系统文件路径]
使用 source sh 无需权限
脚本排错
bash -n [脚本文件] //检查语法错误
bash -x [脚本文件] //检查逻辑错误
脚本错文常见的三种区别
- 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
- 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
- 逻辑错误:只能使用 bash -x 进行
重定向与管道符
重定向
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
| 类型 | 操作符 | 用途 |
|---|---|---|
| 重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
| 重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
| >> | 将输出结果追加到指定的文件尾部 | |
| 标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
| 2>> | 标准错误输出结果追加到指定的文件尾部 | |
| 混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
管道符
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
变量
常见变量类型:
- 自定义变量:由用户自己定义,修改和使用
- 环境变量:由系统维护,用于设置工作环境
- 只读变量:只可以读取不可以更改
- 位置变量:通过命令行给脚本传递参数
- 预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用
变量命名规范
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
- 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
"" 弱引用,其中的变量引用会被替换为变量值
'' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
1.赋值时使用双引号(" ")可以直接调用变量
2.赋值时使用单引号(' ') 不会调用变量
3.赋值时使用``(反撇)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同
4.{}可以分隔变量值
read -p
从键盘输入的内容变成变量
变量作用范围
新定义的变量只在当前的shell环境中有效,因此称为局部变量
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
方法:
- 格式1:export 变量名
- 格式2:export 变量名=变量值
可以使用pstree 查看shell的环境
输入bash进入子shell
ctrl+D组合exit 退出子shell
环境变量
- 由系统提前创建,用来设置用户的工作环境
- 可以使用env查看环境变量
- 需要记住的常用环境变量
特点:
- 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
- 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
- 一般只在系统配置文件中使用,在脚本中较少使用
配置文件
/etc/profile 修改作用于所有用户
~/.bash_profile 用户独立的配置文件
只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
位置变量
位置变量也称为位置参数,使用2、9 表示
$0 表示当前脚本名
[root@jie ~]# vim 1.sh
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
[root@jie ~]# ./1.sh {1..10}
1
2
10
10
1 2 3 4 5 6 7 8 9 10
预定义变量
- $*:表示所有位置参数的内容看成一个整体返回 返回所有
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
- "$$" (双$):当前进程id
- $!: 后台任务最后一个id