内容预知
1.shell的作用与shell脚本的场景运用
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。
其中bsh的特性:
- 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
- 支持查看历史命令(history)
- 支持别名(alias)
- 标准输入和标准输出的重定向
- 管道符
- 文件名通配机制
- 支持命令hash
- 支持变量
1.3 shell 脚本的用途和应用场景
用途:
- 自动化常用命令
- 执行系统管理和故障排除
- 创建简单的应用程序
- 处理文本或文件
应用场景:
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
2.shell脚本的编写规范和执行方法
2.1 shell脚本的编写规范
脚本的命名规范:都是基本名称,以“.bash”为结尾。
脚本代码开头一些规范化:
必备:
- 第一行一般为调用使用的语言
- 程序名,避免更改文件名后无法找到正确的文件
注释信息:
- 版本号
- 更改后的时间
- 作者相关信息
- 该程序的作用,及注意事项
shell 脚本创建:
vim demo1.sh
#!/bin/bash
#this is a shell test!
echo hello,wold!
~
bash demo1.sh
shell 脚本运行:
2.2 shell脚本的执行方法
2.2.1 用指定路径方式去执行文件
指定路径方式执行有两种,一种是绝对路径的方式去执行,一种是相对路径的方式去执行(但是执行的前提一定是该脚本文件拥有执行的权限!)
相对路径的执行方式:
chmod +x demo2.sh //为文件增加执行权限
./demo2.sh //相对路径方式进行执行
绝对路径的执行方式:
/root/demo2.sh // 绝对路径的运行方式
2.2.2 使用解释器名称直接使用脚本
我们在shel脚本中的第一行就声明了/bin/bash 解释器的存在。此时即便该脚本没有执行权限,我们也可以通过 bash 脚本名称 进行执行。
bash demo3.sh
2.2.3 “.”和source 启动脚本
source test.bash 或 . test.sh
2.3 shell脚本执行方法的区别
脚本中的shell环境:指定路径(相对路径和绝对路径执行)和bash执行
当前shell环境中的执行方法:“.”和sourece
2.4 shell脚本执行的错误排查方法
bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误
3.重定向与管道的作用和使用方法
3.1 交互式硬件设备的介绍
标准输入:从该设备中接收用户通过键盘输入的信息
标准输出:通过该设备向用户输出数据
标准错误输出:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
3.2 重定向操作的符号用法
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件中读取数据,不是从键盘输入读取 |
重定向输出 | > | 将输出的结果保存在指定的文件中(覆盖原文件) |
>> | 将输出的结果追加在指定文件的末尾 | |
重定向错误输出 | 2> | 将错误信息保存在指定的文件(覆盖原文件内容) |
2>> | 将错误信息追加在指定文件的末尾 | |
混合输出 | &> | 将标准输出和标准错误信息都保存在同一个文件中 |
3.3 交互硬件设备和重定向符合的运用演示
3.3.1 标准输入,重定向输出,重定向输入的搭配运用
[root@localhost boot]#useradd lisi
[root@localhost boot]#echo '12345'>1.txt
[root@localhost boot]#cat 1.txt
12345
[root@localhost boot]#passwd --stdin lisi <1.txt
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost boot]#id lisi
uid=1001(lisi) gid=1001(lisi) 组=1001(lisi)
[root@localhost boot]#tail -n 2 /etc/passwd
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
3.3.2 合并文件操作
3.3.3 重定向错误输出的运用
[root@localhost opt]#ls abc 2>4.txt
[root@localhost opt]#cat 4.txt
3.3.4 重定向错误输出的第二种表示方法
[root@localhost opt]#ls abc >123.txt 2>&1
[root@localhost opt]#cat 123.txt
3.3.5 混合输出
[root@localhost opt]#ls /opt /xxx &>5.txt
[root@localhost opt]#cat 5.txt
3.5 管道符的运用
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。(管道符的使用前提,一定是管道符前面的命名有输出结果,后面的命令是搭配着输出结果进行操作)
另外:如果管道符符合右边一定要执行对象的命令,则管道符后面要有xargs命令来执行传递参数。
[root@localhost opt]#ss -ntlp|grep 22
4.数值运算的方法
4.1 整数运算
4.1.1 expr 的运用
格式:expr 数值1 运算符 数值2 [运算符 数值3]...
运算符:+(加) - (减) \ * (乘 以) /(除于) %( 取余 (取模))
[root@localhost opt]#expr 1 + 1
2
[root@localhost opt]#expr 5 - 3
2
[root@localhost opt]#expr 3 \* 4
12
[root@localhost opt]#expr 18 / 3
6
[root@localhost opt]#expr 16 \* 3 - 22
26
[root@localhost opt]#expr 16 \* 3 - 22 + 15
41
[root@localhost opt]#expr 5 % 2
1
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 等等
[root@localhost opt]#let i=5+8
[root@localhost opt]#echo $i
13
[root@localhost opt]#i=1
[root@localhost opt]#let i++
[root@localhost opt]#echo $i
2
[root@localhost opt]#let i*=5
[root@localhost opt]#echo $i
10
4.2 小数运算
4.2.1 bc科学计算工具的运用
Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。
- 支持交互式和非交互式两种方式。
- 使用scale=n可以指定精度,即小数点后的位数。要写在算术表达式之前。
[root@localhost opt]#echo "1.1+1.1"|bc
2.2
[root@localhost opt]#echo "13.1-5.6"|bc
7.5
[root@localhost opt]#echo "scale=5;13.1*5.6"|bc
73.36
[root@localhost opt]#echo "scale=5;13.14*5.64"|bc
74.1096
4.2.2 awk命令的计算运用
使用awk进行浮点数的运算,运算结果最多只保留到小数点的后五位。
格式:awk "BEGIN{print 算术表达式}"
[root@localhost opt]#awk "BEGIN{print 1.62*3.2}"
5.184
[root@localhost opt]#awk "BEGIN{print 11.62/3.2}"
3.63125
[root@localhost opt]#awk "BEGIN{print 11.62+3.2}"
14.82
5.变量的运用
5.1 普通变量的定义方法
5.1.1 命令赋值法
注意:定义变量时,变量名只能是由以"_"为开头第一个字符,或者是以字母为开头才可能生效使用
变量名=变量值
[root@localhost opt]#name=1
[root@localhost opt]#echo $name
1
[root@localhost opt]#_yang=123
[root@localhost opt]#echo$_yang
bash: echo123: 未找到命令...
[root@localhost opt]#echo $_yang
123
[root@localhost opt]#2a1=2
bash: 2a1=2: 未找到命令...
5.1.2 通过标准输入来定义变量
格式:read 获取标准输入的内容给 变量
[root@localhost opt]#read -p :"请输入一个数值来赋予变量:" i
:请输入一个数值来赋予变量:1
[root@localhost opt]#echo $i
1
5.1.3 普通变量的全局设置和局部设置
如果只是简单的 变量名=变量值 设置的是局部变量,只对当前shell环境生效
export 变量=变量 设置的是全局变量,对所有的shell环境均生效
注意:变量如果不添加到配置文件中都是暂时的
5.2 环境变量
5.2.1 变量的范围划分
-
环境变量(全局变量):全局生效,在任何bash环境中都可以识别。
-
局部变量:生效范围为当前shell进程。对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。
-
本地变量:生效范围为当前shell进程中某代码片断,通常指函数。 只能在定义它们的函数/脚本内部中使用。
5.2.2 查看所有的环境变量
env
其中用处最为广泛的环境变量为
- $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误识别。)
设置位置变量:
[root@localhost test]#vim test.sh
#!/bin/bash
#this is a test
echo ”第一个变量值为 $1:“
echo ”第二个变量值为 $2:“
echo ”第三个变量值为 $3:“
echo ”第四个变量值为 $4:“
echo ”第五个变量值为 $5:“
echo ”第六个变量值为 $6:“
echo ”第七个变量值为 $7:“
echo ”第八个变量值为 $8:“
echo ”第九个变量值为 $9:“
echo ”第十个变量值为 $10:“
结果展示:
5.5 自定义变量
5.5.1 $0 脚本本身
在定义位置变量时,我们取数值是从1开始的,另外10以上数值要用${10}表示的原因就是因为bash脚本中默认定义了$0为脚本本身的名字。
[root@localhost test]#vim test.sh
#!/bin/bash
#this is a test
echo ”该脚本的名字为:“ $0
结果:
5.5.2 $* $@ 脚本后面跟的所有参数
正常情况下$@和$*是同一个作用 将输入的参数当作是一个整体,一次性输出
[root@localhost test]#vim test.sh
#!/bin/bash
#this is a test
echo ”定义的变量有“ $@
echo "定义的变量有" $*
测试结果:
但是在有双引号中,则作用便不相同:
"$*" 会把脚本后面跟的所有参数当作一个整体看待
"$@" 会把脚本后面跟的所有参数看作多个以空格分隔的个体
[root@localhost test]#vim test.sh
#!/bin/bash
#this is a test
echo "定义的变量有:"
for i in "$*"
do
echo $i
done
echo "定义的变量有:"
for i in "$@"
do
echo $i
done
测试结果:
5.5.3 $? 的作用
$? 可以用来获取上一条命令的返回值,如果将获取返回值的信息转化输出为"0",则表示上一条命令执行成功。如果获取的为非"0"的值,上一条命令执行异常。
[root@localhost test]#ss -ntlp|grep httpd
[root@localhost test]#echo $?
1
[root@localhost test]#ss -ntlp|grep 53
LISTEN 0 5 192.168.122.1:53 *:* users:(("dnsmasq",pid=1315,fd=6))
[root@localhost test]#echo $?
0
6.扩展延伸
6.1 date命令的运用
date默认情况下,用来查看时间日期
另外定义格式: date +"%Y%m%d"
%Y 年份 %d 按月计的日期(例如:01) %d 按月计的日期(例如:01)
[root@localhost test]#date +"%Y%m%d"
20220823
[root@localhost test]#date -d "-1 day" +"%Y%m%d"
20220822
[root@localhost test]#date -d "+1 day" +"%Y%m%d"
20220824
[root@localhost test]#date +"%Y%m01"
20220801
[root@localhost test]#date -d "+1 month" +"%Y%m01"
20220901
[root@localhost test]#
[root@localhost test]#date -d "$(date -d "next-month" +"%Y%m01") -1 day" +"%Y%m%d"
20220831
[root@localhost test]#date -d "$(date +"%Y%m01") -1 day" +"%Y%m%d"
20220731
6.2 本文所有内容写一个简易的用于压缩的脚本
[root@localhost test]#vim test2.sh
#!/bin/bash
BACKUP=backupfiles-$(date +%Y%m%d).tar.gz
tar zcvf $BACKUP $* &> /dev/null
echo -n "已执行 $0 的脚本"
echo -n "共压缩 $# 的文件"
echo "被压缩的文件有:$@"
执行结果:
总结
1.了解shell的作用,以及它与用户和内核之间的关于,调用过程。
2. 掌握规范的脚本编写格式
3. 学会使用在Linux中的运算
4.掌握变量的定义,以及环境变量,位置变量,自定义变量。
5.学会运用管道符和重定向符辅助日常的Linux命令,或则脚本的编写运用
6.熟悉date 命令的一些常用日期获取