内容预知
1.shell的作用与shell脚本的场景运用
shell是Linux系统中后台运行的一种特殊程序也可以理解 成一种特殊的软件,提供了用户与内核进行交互操作的 一种接口。(简单的说就是shell把人类的高级语言转换成二进制数据,让机器明白你的指令)
过程:用户发出指令,通过shell转换成二进制语言被内核识别,内核再调度相对应的硬件,做出相关操作。
cat /etc/shells //linux中查看本机shell种类
bash(/bin/bash)是目前大多数 Linux 版本采用的默认 shell。
其中bsh的特性:
用途:
应用场景:
2.shell脚本的编写规范和执行方法
脚本的命名规范:都是基本名称,以“.bash”为结尾。
脚本代码开头一些规范化:
必备:
注释信息:
shell 脚本创建:
- vim demo1.sh
- #!/bin/bash
- #this is a shell test!
- echo hello,wold!
- ~
-
-
- bash demo1.sh
shell 脚本运行:
指定路径方式执行有两种,一种是绝对路径的方式去执行,一种是相对路径的方式去执行(但是执行的前提一定是该脚本文件拥有执行的权限!)
相对路径的执行方式:
- chmod +x demo2.sh //为文件增加执行权限
-
-
- ./demo2.sh //相对路径方式进行执行
绝对路径的执行方式:
/root/demo2.sh // 绝对路径的运行方式
我们在shel脚本中的第一行就声明了/bin/bash 解释器的存在。此时即便该脚本没有执行权限,我们也可以通过 bash 脚本名称 进行执行。
bash demo3.sh
source test.bash 或 . test.sh
脚本中的shell环境:指定路径(相对路径和绝对路径执行)和bash执行
当前shell环境中的执行方法:“.”和sourece
- bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
-
- bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误
3.重定向与管道的作用和使用方法
标准输入:从该设备中接收用户通过键盘输入的信息
标准输出:通过该设备向用户输出数据
标准错误输出:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件中读取数据,不是从键盘输入读取 |
重定向输出 | > | 将输出的结果保存在指定的文件中(覆盖原文件) |
>> | 将输出的结果追加在指定文件的末尾 | |
重定向错误输出 | 2> | 将错误信息保存在指定的文件(覆盖原文件内容) |
2>> | 将错误信息追加在指定文件的末尾 | |
混合输出 | &> | 将标准输出和标准错误信息都保存在同一个文件中 |
- [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
- [root@localhost opt]#ls abc 2>4.txt
- [root@localhost opt]#cat 4.txt
- [root@localhost opt]#ls abc >123.txt 2>&1
- [root@localhost opt]#cat 123.txt
- [root@localhost opt]#ls /opt /xxx &>5.txt
- [root@localhost opt]#cat 5.txt
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。(管道符的使用前提,一定是管道符前面的命名有输出结果,后面的命令是搭配着输出结果进行操作)
另外:如果管道符符合右边一定要执行对象的命令,则管道符后面要有xargs命令来执行传递参数。
[root@localhost opt]#ss -ntlp|grep 22
4.数值运算的方法
格式: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
格式:
echo $((数值 运算符 数值))
echo $[数值 运算符 数值]
运算符:+(加) -(减) *(乘以) /(除于 ) %(取余)
格式: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
Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。
- [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
-
使用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.变量的运用
注意:定义变量时,变量名只能是由以"_"为开头第一个字符,或者是以字母为开头才可能生效使用
变量名=变量值
- [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: 未找到命令...
格式:read 获取标准输入的内容给 变量
- [root@localhost opt]#read -p :"请输入一个数值来赋予变量:" i
- :请输入一个数值来赋予变量:1
- [root@localhost opt]#echo $i
- 1
如果只是简单的 变量名=变量值 设置的是局部变量,只对当前shell环境生效
export 变量=变量 设置的是全局变量,对所有的shell环境均生效
注意:变量如果不添加到配置文件中都是暂时的
环境变量(全局变量):全局生效,在任何bash环境中都可以识别。
局部变量:生效范围为当前shell进程。对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。
本地变量:生效范围为当前shell进程中某代码片断,通常指函数。 只能在定义它们的函数/脚本内部中使用。
env
其中用处最为广泛的环境变量为
全局配置文件:
用户独立的配置文件:
只读变量,是一开始设置好的变量数值,一旦设置便无法更改或者删除(没有添加到配置中,则是重启后失效,添加后永久保存。或者清除配置中的设置,再重启清除)
格式 : readonly 变量名=变量值
位置变量是$后以数字为结尾的的变量代表着每一个变量和标准输入参数的位置。(数字是以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:“
结果展示:
在定义位置变量时,我们取数值是从1开始的,另外10以上数值要用${10}表示的原因就是因为bash脚本中默认定义了$0为脚本本身的名字。
- [root@localhost test]#vim test.sh
-
- #!/bin/bash
- #this is a test
- echo ”该脚本的名字为:“ $0
结果:
正常情况下$@和$*是同一个作用 将输入的参数当作是一个整体,一次性输出
- [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
测试结果:
$? 可以用来获取上一条命令的返回值,如果将获取返回值的信息转化输出为"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.扩展延伸
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
-
- [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 命令的一些常用日期获取