1.1 shell的作用
shell是Linux系统中后台运行的一种特殊程序也可以理解 成一种特殊的软件,提供了用户与内核进行 交互操作的 一种接口。(简单的说就是shell把人类的高级语言转换成二进制数据,让机器明白你的指令) 过程:用户发出指令,通过shell转换成二进制语言被内核识别,内核再调度相对应的硬件,做出相关操作。
1.2 常见的shell解释器
cat /etc/shells //linux中查看本机shell种类
bash:基于GUN的框架下发展的shell
csh:类似C语言的shell
tcsh:整合了csh 提供了更多功能
sh:已经被bash替换
nologin:让用户无法登录
bash(/bin/bash)是目前大多数 Linux 版本采用的默认 shell。
其中bash的特性:
1. 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
2. 支持查看历史命令(history)
3. 支持别名(alias)
4. 标准输入和标准输出的重定向
5. 管道符
6. 文件名通配机制
7. 支持命令hash
8. 支持变量
1.3 shell 脚本的用途和应用场景
用途:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
应用场景:
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
2.shell脚本的编写规范和执行方法
2.1 shell脚本的编写规范
脚本的命名规范:都是基本名称,以“.bash”为结尾。
脚本代码开头一些规范化:
必备:
1. 第一行一般为调用使用的语言
2. 程序名,避免更改文件名后无法找到正确的文件
注释信息:
1. 版本号
2. 更改后的时间
3. 作者相关信息
4. 该程序的作用,及注意事项
shell 脚本创建:
2.2 shell脚本的执行方法
2.2.1 用指定路径方式去执行文件
指定路径方式执行有两种,一种是绝对路径的方式去执行,一种是相对路径的方式去执行(但是执行的
前提一定是该脚本文件拥有执行的权限!)
相对路径的执行方式:
绝对路径的执行方式:
2.2.2 使用解释器名称直接使用脚本
我们在shel脚本中的第一行就声明了/bin/bash 解释器的存在。此时即便该脚本没有执行权限,我们也 可以通过 bash 脚本名称 进行执行。
2.2.3 “.”和source 启动脚本
2.3 shell脚本执行方法的区别
脚本中的shell环境:指定路径(相对路径和绝对路径执行)和bash执行
当前shell环境中的执行方法:“.”和source
2.4 shell脚本执行的错误排查方法
2.5 shell中的括号
在Shell脚本中,小括号 () 、中括号 [] 和大括号 {} 有不同的用途。以下是它们的主要用法:
小括号 () :
命令替换: 可以使用小括号执行命令替换,将命令的输出嵌套到一个变量中。
子shell: 小括号还可以创建一个子shell,其中的命令会在子shell中执行,不会影响当前 shell的环境。
中括号 [ ] :
条件测试: 中括号用于条件测试,可以用于字符串比较、数值比较等。
数组: 中括号也用于定义数组。
大括号 { } :
代码块: 大括号可以用于创建代码块,将一组命令组合在一起
扩展: 大括号还可以用于进行扩展,生成一系列字符串。
文件重定向: 大括号还可以用于文件重定向。
这只是每种括号的一些主要用法示例,实际上它们还有其他用途。在不同的上下文中,这些括号可能会 有不同的含义。在编写脚本时,理解它们的不同用法可以帮助你更灵活地使用Shell。
3.重定向与管道符的作用和使用方法
3.1 交互式硬件设备的介绍
标准输入:从该设备中接收用户通过键盘输入的信息
标准输出:通过该设备向用户输出数据
标准错误输出:通过该设备报告执行出错信息
3.2 重定向操作的符号用法
3.3 交互硬件设备和重定向符合的运用演示
3.3.1 标准输入,重定向输出,重定向输入的搭配运用
3.3.2 合并文件操作
3.3.3 重定向错误输出的运用
3.3.4 重定向错误输出的第二种表示方法
3.3.5 混合输出
3.5 管道符的运用
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可 以使用多个管道符。(管道符的使用前提,一定是管道符前面的命名有输出结果,后面的命令是搭配着输 出结果进行操作)
另外:如果管道符符合右边一定要执行对象的命令,则管道符后面要有xargs命令来执行传递参数。
4.数值运算的方法
4.1 整数运算
4.1.1 expr 的运用
格式:expr 数值1 运算符 数值2 [运算符 数值3]...
运算符:+(加) - (减) \ * (乘 以) /(除于) %( 取余 (取模))
4.1.2 echo$[ ]和echo $(( ))
格式:
echo $((数值 运算符 数值))
echo $[数值 运算符 数值]
运算符:+(加) -(减) *(乘以) /(除于 ) %(取余)
4.1.3 let的运用
格式:let 变量=运算符<数值>
运算符与echo $[ ]相同
除此之外:
与java,c语言等计算机语言的整数变量用法相似,有
let i++ let i-- let i+=2 let i*=2 等等
4.2 小数运算
4.2.1 bc科学计算工具的运用
Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。
支持交互式和非交互式两种方式。
使用scale=n可以指定精度(运算中包含除法才生效),即小数点后的位数。要写在算术表达式之
前。
4.2.2 awk命令的计算运用
使用awk进行浮点数的运算,运算结果最多只保留到小数点的后五位。
格式:awk "BEGIN{print 算术表达式}"
5.变量的运用
5.1 普通变量的定义方法
5.1.1 命令赋值法
注意:定义变量时,变量名只能以字母或者"_"作为开头
变量名=变量值
5.1.2 变量删除
可以使用 unset 命令来删除变量。 unset 命令用于移除一个或多个变量的定义。
5.1.3 通过标准输入来定义变量
格式:read 获取标准输入的内容给 变量
5.1.4 普通变量的全局设置和局部设置
如果只是简单的 变量名=变量值 设置的是局部变量,只对当前shell环境生效
export 变量=变量 设置的是全局变量,对所有的shell环境均生效
注意:变量如果不添加到配置文件中都是暂时的
5.2 环境变量
5.2.1 变量的范围划分
环境变量(全局变量):全局生效,在任何bash环境中都可以识别。
局部变量:生效范围为当前shell进程。对当前shell之外的其它shell进程,包括当前shell的子
shell进程均无效。
本地变量:生效范围为当前shell进程中某代码片断,通常指函数。 只能在定义它们的函数/脚本内
部中使用。
5.2.2 查看所有的环境变量
其中用处最为广泛的环境变量为
$PATH 表示可执行文件的默认路径
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
5.2.3 环境变量的特性
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。
一般只在系统配置文件中使用,在脚本中较少使用。
5.2.4 环境变量的配置文件
全局配置文件:
/etc/profile,修改此文件会作用于所有用户。
用户独立的配置文件:
~/.bash_profile,修改这个文件只作用于当前用户。
5.3 只读变量
只读变量,是一开始设置好的变量数值,一旦设置便无法更改或者删除(没有添加到配置中,则是重启
后失效,添加后永久保存。或者清除配置中的设置,再重启清除)
格式 : readonly 变量名=变量值
5.4 位置变量
位置变量是$后以数字为结尾的的变量代表着每一个变量和标准输入参数的位置。(数字是以1为开头。 1-9是正常跟在$后面即可。当数字大于或等于10,要用{ }进行使用,区别shell误识别。)
设置位置变量
5.5 自定义变量
5.5.1 $0 脚本本身
在定义位置变量时,我们取数值是从1开始的,另外10以上数值要用${10}表示的原因就是因为bash脚
本中默认定义了$0为脚本本身的名字。
5.5.2 $* $@ 脚本后面跟的所有参数
正常情况下$@和$*是同一个作用 将输入的参数当作是一个整体,一次性输出 $#代表传入的参数个数
测试结果:
但是在有双引号中,则作用便不相同:
"$*" 会把脚本后面跟的所有参数当作一个整体看待
"$@" 会把脚本后面跟的所有参数看作多个以空格分隔的个体
5.5.3 $? 的作用
$? 可以用来获取上一条命令的返回值,如果将获取返回值的信息转化输出为"0",则表示上一条命令执行
成功。如果获取的为非"0"的值,上一条命令执行异常。
6.变量的替换与截取
${variable} :获取变量的值。
${var:+value} :如果变量被定义,返回value,否则返回空
${variable:-value}:如果变量为空或未定义,则使用默认值。
${variable:=value}:如果变量为空或未定义,则设置默认值。
${variable:?message}:如果变量为空或未定义,则输出错误消息。
字符串的截取
${variable%pattern}:删除变量末尾匹配到的模式。
${variable#pattern} :删除变量开头匹配到的模式。
${variable%%pattern} :删除变量末尾最长匹配到的模式。
${variable##pattern} :删除变量开头最长匹配到的模式。
统计字符串的长度
7. 扩展延伸
7.1 date命令的运用
date默认情况下,用来查看时间日期
另外定义格式: date +"%Y%m%d"
%Y 年份 %d 按月计的日期(例如:01) %d 按月计的日期(例如:01)