一、简介
- 用户通过shell向计算机发送指令
- 计算机通过shell给用户返回指令的执行结果
1.1 通过shell编程可以达到的效果
- 提高工作效率
- 可以实现自动化
1.2 需要学习的内容
- Linux
- shell的语法规范
1.3 编写shell的流程
- 第一步:用vi/vim创建一个.sh的文件
- 第二步:在文件中进行开发
- 第三步:给文件赋予可执行权限
- 第四步:执行脚本
二、变量
2.1 变量分类
- 本地变量
- 局部变量
- 环境变量
- 位置变量
- 特殊变量
2.2 本地变量
- 定义变量:Var_Name="Value" 变量名=变量值
- 引用变量:${Var_Name} [{}可以省略不写]
- 撤销变量:unset Var_Name
本地变量适合在终端使用,新开一个终端或关闭后就会消失
例:
本地变量在哪里都可以用,文件和终端不在一个环境内
2.3 局部变量
定义:local Var_Name="Value"
- 局部变量只在函数内部生效
例:
a{name=张三echo
}
b{name=李四echo
}
只在内部有效,出了花括号没用
2.4 环境变量
- 定义:expot Var_Name="Value" 【最好不要自己随便定义,环境变量都是大写的】
- set命令可以显示当前系统上的所有变量
- export、env命令可以显示环境变量
常用的环境变量
- PS1 #命令提示符
- HOSTNAME #存放主机名的
- LANG #语言
- ...
2.5 位置变量
主要用于橡胶板中传递参数
表示方法:$1,$2,$3,..$n
例: ./1.sh 1 5 9 (传入的参数)
2.6 特殊变量
- $0 #脚本自身的名称
- $? #上个命令的执行状态
- $# #参数列表
2.7 变量命名要求:
- 只能使用数字、字母和组成
- 不能以数字开头
- 不能使用程序中的关键字
2.8 变量名的默认规则:
- 见名知意
- 自定义变量小写
- 环境变量大写
三、重定向
3.1 什么是重定向?
重定向就是修改指令发送给计算机的途径,计算机将指令执行结果返回给用户的途径
3.2 重定向的分类
- 输出重定向
- 标准输出重定向
- 错误输出重定向
3.2.1 输入
- 标准输入:键盘
- 输入重定向:<
3.2.2 输出
- 标准输出:终端
- 标准错误输出:终端
- 标准输出重定向:> >>
- 标准错误输出重定向:2> 2>>
将结果保存到文件、屏蔽输出结果
3.3 特殊文件
- /dev/null
- /dev/zero
dd if=/dev/zero of=zeros.bin bs=1G count=100000
#读0,用来测试的,不显示内容但会占用内存
3.4 管道符
- |
- 仅仅用于传递命令的执行结果给另一个命令
四、bash条件判断基础
4.1 判断的作用:
- 判断后续操作的前提条件是否满足
- 如果满足执行一种指令,不满足则执行另一种指令
4.2 条件测试类型
- 整型测试
- 字符测试
- 文件测试
4.3 逻辑运算
4.3.1 与运算 &&
- 真&&真=真
- 真&&假=假
- 假&&假=假
- 假&&真=假
4.3.2 或运算 ||
- 真||真=真
- 真||假=真
- 假||真=真
- 假||假=假
4.3.3 非运算 !
- !真=假
- !假=真
4.4 操作符
- -gt 大于
- -lt 小于
- -ge 大于等于
- -le 小于等于
- -ne 不等于
- -eq 等于
4.5 判断方式
test EXPRESSION
例:test 3 -gt 4
[EXPRSSION]
例: [ 3 -gt 4 ]
[[ EXPRESSION ]]
例:[[ 2 -gt 1 ]]
用命令执行状态来作为判断条件
查看脚本的执行过程:
bash -x 脚本名
4.6 bash 条件判断语法格式
if判断的三种格式
4.6.1 单分支
if 条件;then分支1
fi
4.6.2 双分支
if 条件;then分支1
else分支2
fi
4.6.3 多分支
if 条件;then分支1
elif分支2
elif 分支3
...
else分支
fi
例:成绩大于90,则输出成绩A;成绩大于80,则输出成绩B;成绩大于70,则输出成绩C;成绩大于60,则输出成绩D;0分以上则输出E
例:让用户指定一个文件,判断如果有空白行,就显示空白行数,没有则提示"no"
4.7 整型测试方法:
整型测试通常都是二元测试
格式是:num1 oprand num2
4.8 用户和脚本进行交互
位置变量
read命令
read -p "参数" 变量名
例:
read -p "请输入第一个数字:" num
例题:
让用户通过键盘输入一个用户,如果用户存在就显示其用户的用户名和uid,否则就显示用户不存在
4.9 字符测试法
双目测试
比较两个字符串
- == 等于,等值比较
- != 不等于
- =~ 匹配是否在范围
单目测试
- -n $stringVar:字符串是否为空,不空为真,空则假
- -z $stringVar:字符串是否为空,空则为真,不空为假
例:
- -a:用于逻辑与的操作
- -e:检查文件是否存在
例:
- -f:检查文件是否为普通文件
- -d:检查文件是否为目录文件
- -r:检查文件是否可读
- -w:检查文件是否可写
- -x:检查文件是否可执行
例:让用户输入一个用户名,先判定用户是否存在,不存在以7为退出码;
判断用户的shell是否为/bin/bash,如果是则显示"bash user",退出码为0,否则则显示为"not bash user" 退出码为1
- -b:判断是否存在且是一个块特殊文件
例:1.显示如下菜单
cpu) show cpu info;
mem) sowmemory info;
quit) quit
请输入你的选择:
2.如果用户选择了cpu则显示文件/proc/cpuinfo的信息;
3..如果用户选择了mem则显示文件/proc/meminfo的信息;
4.如果用户选择了quit则退出且状态码为5;
5.如果用户输入其他其他字符,则显示未知选项请重新执行脚本,退出码为6;
4.10 位置参数轮替
#!/bin/bash
echo "参数列表:$#"
echo "参数列表:$@"
echo " "
shift 2
echo "参数列表:$#"
echo "参数列表:$@"
echo " "
shift 2
echo "参数列表:$#"
echo "参数列表:$@"
说明:shift在这里就是起到了一个轮替的作用,2表示一次轮替2个参数
在下一次echo的时候,参数会从轮替后的数字开始计算
例:使用形式如下:username u username[v{1|2}]
-u选项用于指定用户名;脚本显示用户的uid,gid
如果同时使用-v选项,v后面值是1,显示用户的家目录
v后面的值是2,显示用户的家目录和shell类型