目录
一、shell脚本概述
1.1 shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。
1.2 linux中常见的shell
通过 cat /etc/shells 查看当前系统支持的shell
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录
注:bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
1.3 什么是shell脚本及构成
shell脚本 就是将命令按顺序一一列出,最后自动执行,执行需要权限,也可以直接使用路径,脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本。
构成:
- 声明解释器
- 注释信息
- 执行命令
格式:
#!/bin/bash
#声明解释器 代表我接下来,使用什么解释器来解释,接下来的命令
# “#” 表示注释信息
cd /opt
mkdir test
#可执行的命令
#以.sh 结尾的文件 命令会高亮
1.4 shell脚本的执行逻辑与方式
执行逻辑:
-
顺序执行:程序按从上到下顺序执行
-
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句
执行方式:
1.直接调用shell 解释器 加上脚本的名字 bash 脚本名 不需要加上权限
2.路径/脚本 路径:绝对 相对 但是这个需要权限
3.source(.) 加脚本 名字 不建议使用 不需要权限 会修改目前的环境内容,会有一些问题
代码:
cd /opt #进入opt目录下
vim first.sh #创建first。sh脚本
first.sh中的内容:
#!/bin/bash
#这是我的第一个脚本,内容为输入ni hao!
echo "ni hao!" #输出内容为ni hao!
bash first.sh #调用系统shell执行脚本
chmod +x first.sh #添加可执行权限
/opt/first.sh #绝对路径执行脚本
cd /opt #进入脚本所在目录
./first.sh #相对路径执行脚本
. first.sh # . 执行脚本
source first.sh #source 执行脚本
实现效果:
1.5 脚本错误
1.命令错误 不会影响接下来的 命令执行,但是本条命令不执行
bash -x 脚本 bash -x 会自运行一遍检查错误
2.语法错误 直接影响脚本无法正常运行
bash -n 脚本 检查语法错误
3.逻辑错误
不会影响命令的执行,只是得到的结果不同
二、重定向与管道符
2.1 重定向
重定向:改变电脑数据的输出方向,默认 电脑数据的输出方向是屏幕
电脑给你的回复一定会在屏幕上 我们称为:标准输出
如果电脑没有正确回复 我们称为:错误输出
我们通过键盘鼠标扫描仪话筒等设备输入给电脑的指令 我们称为:标准输入
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果换行添加在文件尾部 |
重定向错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
重定向错误输出 | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2.2 管道符
| 管道符
将第一个命令的结果 当做后一个命令的处理对象
三、变量
3.1 变量的定义
变量是计算机语言中能储存计算结果或能表示值的抽象概念。
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
3.2 变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
3.3 变量名要求
①定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)
②定义变量时,变量名要求:
变量名区分大小写建议全部使用大写,不能使用系统内置变量。如$PATH是系统外部命令的存放路径等。
变量名不能以数字开头,且不支持短横线-。
3.4 变量类型
1.自定义 的变量 由用户自定义、修改和使用
2.预定义变量 $? $$ $* $@ shell中 程序自带的
3.环境变量 env 看到所有环境的变量
4.只读变量 只可以读 不可以写
5.位置变量 $1 $2 .... $n
1.自定义变量
命名要求:
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
- 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
定义新的变量:
格式:变量名=变量值
查看定义的变量值:
格式: echo $变量名
’
赋值时使用符号
-
双引号:允许通过$符号引用其他变量值
-
单引号:禁止引用其他变量值, $视为普通字符
-
反撇号:命令替换,提取命令执行后的输出结果,``和$(…)作用相同
-
{}:分隔变量值
-
定义变量时中间有特殊字符,如空格,可以使用单引号或双引号
2.预定义变量
系统直接定义好的变量,直接使用即可
$* | 表示所有位置参数的内容看成一个整体返回 返回所有 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有 |
$? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常 |
$# | 表示命令行中位置参数的总个数 |
$0 | 表示当前执行的脚本或程序的名称 当前脚本的名字 |
$$ | 当前bash的进程id |
$! | 后台任务最后一个id |
3.环境变量
使用env命令查看所有环境变量
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
常用环境变量:
- $USER 表示用户名称
- $HOME 表示用户的宿主目录
- $LANG 表示语言和字符集
- $PWD 表示当前所在工作目录
- $PATH 表示可执行用户程序的默认路径
4.只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
5.位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
3.5 整数的运算
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
- 加法 +
- 减法 -
- 乘法 \ *
- 除法 /
- 取余 (取模)%
3.6 变量的作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
全局变量格式1:export 变量名
全局变量格式2:export 变量名=变量值