Shell编程
Shell编程
lycheeKingShell编程基础
Shell变量
设置环境变量
1.基本语法
export 变量名=变量值 (功能描述:将 shell 变量输出为环境变量/全局变量)
source 配置文件 (功能描述:让修改后的配置信息立即生效)
echo $变量名 (功能描述:查询环境变量的值)
示意图:
2.快速入门
在/etc/profile 文件中定义 TOMCAT_HOME 环境变量
查看环境变量 TOMCAT_HOME 的值
在另外一个 shell 程序中使用 TOMCAT_HOME
注意:在输出 TOMCAT_HOME 环境变量前,需要让其生效
source /etc/profile
shell 脚本的多行注释
:<<! 内容 ! (==注意换行==)
位置参数变量
介绍:
当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如 : ./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
语法
$n (功能描述:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#
(功能描述:这个变量代表命令行中所有参数的个数)
位置参数变量案例
案例:编写一个 shell 脚本 position.sh , 在脚本中获取到命令行的各个参数信息
预定义变量
基本介绍
就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
基本语法
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
应用实例
在一个 shell 脚本中简单使用一下预定义变量
preVar.sh
1 | !/bin/bash |
- 执行结果:
运算符
基本介绍
- 学习如何在 shell 中进行各种运算操作。
基本语法
“$((运算式))”或“ $[运算式]”(==推荐==)或者 expr m + n //expression 表达式
注意==expr 运算符间要有空格==, 如果希望将 expr 的结果赋给某个变量,使用 ``(反引号)
expr m - n
expr *, /, % 乘,除,取余
应用实例 oper.sh
案例 1:计算(2+3)X4 的值
案例 2:请求出命令行的两个参数[整数]的和 20 50
1 | !/bin/bash |
条件判断
判断语句
基本语法
[ condition ](注意 ==condition 前后要有空格==)
#非空返回 true,可使用$?验证(0 为 true,>1 为 false)
应用实例
[ lcw ] 返回 true
[ ] 返回 false
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句
判断语句
常用判断条件
- = 字符串比较
- 两个整数的比较
-lt 小于
-le 小于等于 little equal
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
- 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
- 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
应用实例
案例 1:”ok”是否等于”ok”
判断语句:使用 =
案例 2:23 是否大于等于 22
判断语句:使用 -ge
案例 3:/root/shcode/aaa.txt 目录中的文件是否存在
判断语句: 使用 -f
代码如下:
流程控制
if 判断
- 基本语法
if [ 条件判断式 ] then
代码
fi
或者 , 多分支
if [ 条件判断式 ] then
代码
elif [条件判断式] then
代码
fi
注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
应用实例 ifCase.sh
1 | !/bin/bash |
case 语句
- 基本语法
1 | case $变量名 in |
- 应用实例 testCase.sh
案例 1 :当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出”周二”, 其它情况输出 “other”
1 | !/bin/bash |
for 循环
基本语法 1
for 变量 in 值 1 值 2 值 3… do
程序/代码
done
应用实例 testFor1.sh
案例 1 :打印命令行输入的参数 [这里可以看出 \$*
和 $@
的区别]
基本语法 2
for (( 初始值;循环控制条件;变量变化 ))
do
程序/代码
done
应用实例 testFor2.sh
案例 1 :从 1 加到 100 的值输出显示
while 循环
- 基本语法 1
while [ 条件判断式 ]
do
程序 /代码done
注意:while 和 [
有空格,条件判断式和 [
也有空格
- 应用实例 testWhile.sh
#案例 1 :从命令行输入一个数 n,统计从 1+..+ n 的值是多少?
1 | !/bin/bash |
read 读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。参数
变量:指定读取值的变量名
应用实例 testRead.sh
案例 1:读取控制台输入一个 NUM1 值
案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
代码:
1 | !/bin/bash |
函数
函数介绍
- shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。
系统函数
==basename 基本语法==
- 功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
- 选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
- 应用实例
案例 1:请返回 /home/aaa/test.txt 的 “test.txt” 部分
1 | basename /home/aaa/test.txt |
==dirname 基本语法==
- 功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
- 应用实例
案例 1:请返回 /home/aaa/test.txt 的 /home/aaa
1 | dirname /home/aaa/test.txt |
自定义函数
- 基本语法
[ function ] funname[()]
{
Action; [return int;]
}
——> 调用直接写函数名:funname [值]
- 应用实例
案例 1:计算输入两个参数的和(动态的获取), getSum
1 | !/bin/bash |
Shell 编程综合案例
需求分析
每天凌晨 2:30 备份 数据库 lcw_data 到 /data/backup/db
备份开始和备份结束能够给出相应的提示信息
备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2021-03-12_230201.tar.gz
在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。
画一个思路分析图
代码 /usr/sbin/mysql_db.backup.sh
1 | 备份目录 |
扩展:
tar
我们在windows下经常进行压缩解压等操作。在linux上也经常会用到,但是比较常见的是.tar.gz
1 | .tar: |
linux中三种time(atime,mtime,ctime)
文件的三个时间
我们已经很熟悉windows系统了,那么我们在windows下新建一个文件,我们知道它在保存的时候肯定是会保存一下文件的创建时间之类的信息的,那么我们来看看windows下的一个文件保存了几个时间信息。
这是我在电脑找到的一个 sql
文件,看它的属性是可以看到保存了这个文件的创建时间、修改时间、和访问时间三个时间。
那么在linux中是怎样的,我们在linux中新建一个文件,然后用stat命令查看文件信息,如下图:
可以从上图看到系统为我们保存了这个的三个时间,分别是Access time、Modify time、Change time,也就是访问时间、修改时间和状态时间。
那么与前面所说的windows下做一个对比:
在windows下,一个文件有:创建时间、修改时间、访问时间。
相似的在Linux下一个文件也有三种时间属性:
(与windows不同的是linux没有创建时间,而多了个访问时间)
1>访问时间(access time 简写为atime)
2>修改时间(modify time 简写为mtime)
3>状态时间(change time 简写为ctime)
那么可以知道,在linux中是文件是没有创建时间的,只是如果刚刚创建一个文件,毋庸置疑它的三个时间是都等于创建时间的,就像刚才创建的test文件,我们看到它的三个时间是相等的。那么在linux上这三个时间分别代表着什么,随着什么而改变:
修改时间(mtime):文件的内容被最后一次修改的时间,我们经常用的ls -l命令显示出来的文件时间就是这个时间,当用vim对文件进行编辑之后保存,它的mtime就会相应的改变;
访问时间(atime):对文件进行一次读操作,它的访问时间就会改变。例如像:cat、more等操作,但是像之前的state还有ls命令对atime是不会有影响的;
状态时间(ctime):当文件的状态被改变的时候,状态时间就会随之改变,例如==当使用chmod、chown等改变文件属性的操作是会改变文件的ctime的。==