文章目录
1.Shell脚本基础
1.1什么是Shell
Shell 是一类程序的总称,用于将人类使用的高级语言转换成机器能看懂的二进制语言,为用户和内核之间的交互提供接口。
1.2什么是Shell脚本
- 将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用绝对路径
- 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本构成
1.3脚本构成
- 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
- 注释信息:以#开头的语句表示为注释信息
- 可执行语句:比如echo命令用于输出“ ”之间的字符串
例;
1.3脚本的执行逻辑及执行方式
脚本执行逻辑
-
顺序执行:程序按从上到下顺序执行
-
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句
执行方式
1.指定路径去执行文件(要有执行权限)
以相对路径方式启动
以绝对路径的方式启动
2.指定解释器去执行(不需要权限)
需要当前位于脚本所在目录
指定了使用 bash去执行脚本不需要权限
1.4脚本错误调试
1.4.1错误的类型
命令错误
命令出错不会影响接下来的命令继续
语法错误
会影响接下来的命令
逻辑错误
只能自己去筛查
查代码正确选项
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 逻辑错误
总结:脚本错误常见的有三种区别
-
语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
-
命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
-
逻辑错误:只能使用 bash -x 进行
2.重定向与管道符
2.1重定向的概念
不通过标准输出到屏幕上,输出到你指定的位置
2.2重定向的类型及用途
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
2.3管道符
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
命令一 | 命令二
3.变量
3.1变量的概念
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
3.2变量的类型
变量类型 | 含义 |
---|---|
自定义变量 | 由用户自己定义,修改和使用 |
环境变量 | 由系统维护,用于设置工作环境 |
只读变量 | 只可读取不可以更改 |
位置变量 | 通过命令给脚本传递参数 |
预定义变量 | Bash中设置的一类变量,不能修改,有些规定好的变量 放在那里让你使用 |
自定义变量:由用户自己定义,修改和使用。
特殊变量:环境变量、只读变量、位置变量、预定义变量。
3.2.1自定义变量
3.2.1.1自定义变量
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
- 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除
定义所添加的特殊符号及其作用
特殊符号 | 作用 |
---|---|
{ } | 确定变量范围 |
‘’ | ![]() |
“” | ![]() |
$()或`` | ![]() |
总结
1.赋值时使用双引号(" ")可以直接调用变量
2.赋值时使用单引号(’ ')
只会被认为是字符
只会被认为是字符
只会被认为是字符 不会调用变量
3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同
4.{}可以分隔变量值
变量追加值(临时,重启后消失)
变量名+=追加值
3.2.1.2read -p
从键盘输入的内容变成变量
read -p "文本内容" 变量名
3.2.1.3 将局部变量转化为全局变量
定义
局部变量:默认情况下,新定义的变量只在当前的shell环境中有效,当进入子程序或新的shell环境中,局部变量将无法再起作用。
全局变量:在新的shell环境中可以继续使用。
格式
1.:export 变量名
2.:export 变量名=变量值
#可以使用pstree 查看shell的环境
#输入bash进入子shell
#ctrl+D组合exit 退出子shell
3.2.2环境变量
定义
- 由系统提前创建,用来设置用户的工作环境
- 可以使用env查看环境变量
env
#可查看当前所有环境变量
- 常用的常用环境变量
$PATH 表示可执行用户程序的默认路径
$HOME 表示用户的家目录
$PWD 表示当前所在的工作目录
$LANG 查看当前语言和字符集
$USER 当前用户用户名
环境变量的全局配置文件
#配置文件位置
/etc/profile
##修改此文件,全局生效,可用于长期变更或设置环境变量
3.2.3只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量
3.2.4 位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
3.2.5 预定义(状态)变量
系统定义变量
状态变量 | 功能 |
---|---|
$* | 表示所有位置参数的内容看成一个整体返回 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有 |
$? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常 |
$# | 表示命令行中位置参数的总个数 |
$0 | 表示当前执行的脚本或程序的名称即程序本身 |
$$ | 当前进程id |
$! | 后台任务最后一个id |
3.2.6 整数运算
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
变量要和运算符隔开
运算法则
加法:num1 + num2
减法:num1 - num2
乘法:num1 \ * num2
整除:num1 / num2
取余(求模):num1 % num2 (求 num1 除以 num2 的余数)
格式: expr 变量1 运算符 变量2 [运算符 变量3]
例:
生成随机数
expr $RANDOM % 33
#随机生成0-33之间的数
expr $[RANDOM % 10 + 1]
#随机生成1-10之间的数
echo $[RANDOM % 10 + 1]
#同上
i++ 和 ++i
i=1;j=1;expr j=i++;echo $i $j
2 1
i=1;j=1;expr j=++i;echo $i $j
2 2