本文旨在梳理必须掌握的 Linux 指令以及 Shell 编程。接下来将从虚拟机安装、Linux 系统安装、Linux 远程登录工具、Linux 文件上传工具、Linux 指令、Linux 下的 jdk 安装、Linux 下的 tomcat安装、Linux 下的 mysql安装、Shell 编程来全面梳理 Linux 的必知必会知识点。
需要的所有软件可私信我,我发给你。
注:
虚拟机安装可参考这位这位作者的文章
VMware Workstation 17 安装教程 - 知乎
CentOS 安装可参考这位作者的文章
CentOS 7系统安装配置图解教程_centos7_tiny丶的博客-CSDN博客
远程登录工具使用Xshell7
文件上传工具使用Xftp7
jdk 选用17以上,因为springboot3 要求17
tomcat 选用10以上
mysql我用的8,可参考该作者文章
Linux下安装MySQL8_linux安装mysql8_爪哇_怪盗基德的博客-CSDN博客
一、Linux 目录结构
1、介绍
linux 的文件系统是采用层级式的树状目录结构,在此结构中的最上层目录是 / ,然后才在此目录下创建其他目录。
2、目录结构
既然要使用 linux ,那么对于它的各个目录自然要知道都分别有什么用,打开根目录可以看到以下目录结构
/bin 这个目录存放着常用指令
/sbin 这个目录存放着管理员使用的系统管理程序
/home 这个目录用于存放普通用户的主目录,也叫家目录,你创建的任何用户都会在此目录下
/root 这个目录为系统管理员,也称超级权限者的用户主目录
/lib 这个目录为系统开机所需的最基本的动态连接共享库
/lost+found 这个目录一般不会出现,只有在系统非法关机后才会出现,并且存一些文件
/etc 这个目录很重要,用于存放系统管理所需的配置文件
/usr 这个目录很重要,用户的很多应用程序和文件都在这个目录下
/boot 这个目录存放的是系统启动时的一些核心文件,包括一些连接文件和镜像文件
/proc 这个目录一定不能动,它是系统内存的映射,可以访问该目录来获取系统信息
/srv 这个目录一定不能动,存放一些服务启动后需要提取的数据
/sys 这个目录一定不能动,该目录下有文件系统 sysfs
/tmp 这个目录是用来存放一些临时文件的
/dev 这个目录下存放的是各种硬件对应的文件形式
/media linux系统会自动识别一些设备,如 u 盘等,识别后就会将该设备挂载在此目录下
/mnt 这个目录是让用户临时挂在别的文件系统的,如共享文件
/opt 这个目录默认为空,用来存放主机需要额外安装的软件
/usr/local 这个目录是另一个用来存放主机需要额外安装的软件,一般是通过编译源码方式安装的程序
/var 这个目录存放会不断扩充的东西,一般将经常修改的目录放在此,最常见的就是日志文件
/selinux 是一种安全子系统,能控制程序只访问特定文件
二、vi 和 vim 常用的三种模式
vi 和 vim 是 linux 最长用的编辑器
1、一般模式(默认)
以 vim 打开某个文件,一进入就是一般模式,该模式下不可更改文件
2、编辑模式
按 i 或 a 都能进入编辑模式,进入该模式后才可以对文件进行修改。在该模式下左下角会显示插入
3、命令行模式
需要在一般模式下才能进入命令行模式,如果在编辑模式则需要按 ESC 键来返回一般模式。在一般模式下后,按 :或者 / 就可以进入命令行模式,在该模式下可以提供相关指令,完成读取、存盘、替换、离开 vim 、显示行号等功能。左下角会显示 :或 / ,之后可输入 wq 代表保存并退出,q 代表退出,q!代表强制退出
4、快捷键的使用
(1)yy 拷贝当前行。5 yy 拷贝从当前行向下的5行。p 即进行粘贴
(2)dd 删除当前行。5 dd 删除从当前行向下的5行
(3)在一般模式下输入 / 来进入命令行模式,再输入关键字,按回车后即可进行查找,输入 n 即查找下一个
(4)在一般模式下输入 :,进入命令行模式,输入 set nu,即可显示行号,输入 set nonu,即取消行号
(5)在一般模式下 输入 gg 即到文件首行,输入 G 即到文件末行
(6)如果想撤销之前的操作,则在一般模式下按 u 即可
(7)在一般模式下,输入一个数字,再按下 shift g ,即可跳转到你输入数字所指向的行
三、关机和重启命令
1、介绍
shutdown -h now,立刻进行关机
shutdowm -h 1,一分钟后关机
shutdown -r now,立刻进行重启
halt,立刻关机
reboot,立刻重启
sync,把内存数据同步到磁盘
2、注意
不管是重新启动还是关闭系统,最好都手动执行一次 sync 命令,把内存中的数据写到磁盘中
四、用户登录和注销
1、介绍
(1)切换用户
su - 用户名
(2)输入 logout 注销用户
loglout
2、注意
尽量少用 root 账号,避免误操作。logout 注销指令在图形运行级别无效,在运行级别 3 才有效
五、用户管理
1、介绍
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号
2、添加用户
(1)基本语法
useradd 用户名
(2)说明
在创建用户成功后,会自动创建和用户同名的家目录。也可以通过 useradd -d 目录名 用户名,给新创建的用户指定家目录
3、指定/修改密码
(1)基本语法
passwd 用户名
pwd,显示当前用户所在目录
(2)说明
如果你输入的密码过于简单,他会提示你,不过你可以不管他接着输入就好,会生效的
4、删除用户
(1)基本语法
userdel 用户名
userdel -r 用户名
(2)说明
可以看到家目录中已经没有 visiter03 了,如果不用 -r 则只会删除用户,但是用户的家目录会留下,使用 -r 则连家目录都不会留下。而一般就算删除用户还是会留下家目录的,因为其中存放了很多该用户的成果(如果你觉得这个用户写的东西啥都不是,那就给他彻底删掉,hh)
5、查询用户信息指令
(1)基本语法
id 用户名
6、查看当前登录用户
(1)基本语法
whoami
who am i
7、用户组
(1)介绍
类似于角色,将不同用户但是有相同共性的,放在一个用户组下,则只需要对用户组分配权限,组内用户就自然有该权限
(2)新增组
groupadd 组名
(3)删除组
groupdel 组名
(4)增加用户时直接加上组
useradd -g 用户组名 用户名
8、用户和组相关文件
(1)/etc/passwd 文件
用户的配置文件,记录用户的各种信息
每行含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
(2)/etc/shadow 文件
口令配置文件
每行含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
(3)/etc/group 文件
组的配置文件,记录 linux 包含的组的相关信息
每行含义:组名:口令:组标识号:组内用户列表
六、实用指令
1、指定运行级别
(1)运行级别说明
0:关机
1:单用户模式,可以用来找回密码
2:多用户状态无网络服务
3:多用户状态有网络服务(multi_user.target)
4:系统未使用,保留给用户
5:图形界面(graphical.target)
6:系统重启
常用运行级别为 3 和 5
(2)切换运行级别
init [0123456]
(3)查看当前默认运行级别
systemctl get-default
(4)设置默认级别
systemctl set-default TARGET.target
2、通过单用户模式找回密码
(1)启动系统,在界面按 e 进入编辑页面
(2)进入编辑页面,找到以 Linux16 所在段的最后,输入 init=/bin/sh
(3)输入完成后,按快捷键 ctrl+x 进入单用户模式
(4)接着在光标闪烁的位置输入 mount -o remount,rw /,完成后按回车
(5)在新的一行输入 passwd,即可修改密码
(6)接着在鼠标闪烁处输入 touch /.autorelabel,完成后按回车
(7)继续在光标闪烁处,输入 exec ./sbin/init,完成后按回车,系统会自动重启,新的密码生效
3、帮助指令
(1)man,获得帮助信息
基本语法:man [命令或配置文件]
注:在 linux 下,隐藏文件是以 . 开头
(2)help,获得 shell 内置命令的帮助信息
基本语法:help [命令]
4、文件目录类
(1)pwd 指令,显示当前工作目录的绝对路径
基本语法:pwd
(2)ls 指令
基本语法:ls [选项] [目录或是文件]
常用选项:
-a:显示当前目录所有的文件和目录,包括隐藏的
-l:以列表的方式显示信息
(3)cd 指令,切换到指定目录
基本语法:cd [参数]
cd 或 cd~ ,回到自己的家目录
cd.. ,回到当前目录的上一级目录
(4)mkdir 指令,用于创建目录
基本语法:mkdir [选项] 要创建的目录名
常用选项:
-p:创建多级目录
(5)rmdir 指令,删除空目录
基本语法:rmdir [选项] 要删除的空目录
注意:rmdir 删的是空目录,如果目录下有内容,则无法删除
(6)touch 指令,创建空文件
基本语法:touch 文件名称
(7)cp 指令,拷贝文件到指定目录
基本语法:cp [选项] source dest
常用选项
-r:递归复制整个文件夹
注意:强制覆盖不提示的方法 \cp
(8)rm 指令,移除文件或目录
基础语法:rm [选项] 要删除的文件或目录
常用选项:
-r:递归删除整个文件夹
-f:强制删除不提示
(9)mv 指令,移动文件与目录或重命名
基本语法:mv oldNameFile newNameFile(重命名)
mv /temp/moveFile /targetFolder(移动文件)
(10)cat 指令,查看文件内容
基本语法:cat [选项] 要查看的文件
常用选项:
-n:显示行号
注意:cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上管道命令 | more
(11)more 指令
基本语法:more 要查看的文件
操作说明:
空白键 向下翻一页
enter 向下翻一行
q 离开 more ,不再显示该文件内容
ctrl+f 向下滚动一屏
ctrl+b 返回上一屏
= 输出当前行号
:f 输出文件名和当前行号
(12)echo 指令,输出内容到控制台
基本语法:echo [选项] [输出内容]
(13)head 指令,显示文件开头部分,默认显示前10行
基本语法:head 文件
head -n 5 文件(查看头5行内容)
(14)less 指令,在显示文件内容时,并不是一次将整个文件加载后才显示,而是根据需要加载内容,对于显示大型文件有较高效率
基本语法:less 要查看的文件
操作说明
空白键 向下翻一页
pagedown 向下翻一页
pageup 向上翻一页
/字符串 向下搜寻字符串的功能;n,向下寻找;N,向上寻找
q 离开 less
(15)tail 指令,输出文件中尾部的内容,默认显示尾10行
基本语法:tail 文件
tail -n 5 文件
tail -f 文件(实时追踪文档的所有更新)
(16)> 指令和 >> 指令,> 输出重定向和 >> 追加
基本语法:ls -l > 文件(列表的内容写入文件中)
ls -al >> 文件(列表的内容追加的文件末尾)
cat 文件1 > 文件2 (将文件1的内容覆盖到文件2)
echo “内容” >> 文件
(17)ln 指令,软连接也叫符号连接
基本语法:ln -S [原文件或目录] [软连接名]
注意:当我们使用 pwd 查看目录时,仍然看到的是软连接所在目录
(18)history 指令,查看已执行过的历史命令,也可执行历史命令
基本语法:history
5、时间日期类
(1)date 指令,显示当前日期
基本语法:date(显示当前时间)
date +%Y(显示当前年份)
date +%m(显示当前月份)
date +%d(显示当前是那一天)
date “+%Y-%m-%d %H:%M:%S”
(2)date 指令,设置日期
基本语法:date -S 字符串时间
(3)cal 指令,查看日历
基本语法:cal [选项] ,不加选项就显示本月日历
6、搜索查找类
(1)find 指令,从指定目录向下递归的遍历各个子目录,将满足条件的文件或目录显示出来
基本语法:find [搜索范围] [选项]
选项说明:
-name,按指定的文件名查找模式查找文件
-user,按指定用户名查找文件
-size,按指定文件大小查找文件
(2)locate 指令,无需遍历整个文件系统,查询速度较快
基本语法:locate 搜索文件名
注意:由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库
(3)which 指令,查看某个指令在哪个目录下
(4)grep 指令和管道符号
grep 过滤查找,管道符 | ,表示将前一个命令的处理结果传给后面的命令处理
基本语法:grep [选项] 查找内容 源文件
常用选项:
-n:显示匹配行及行号
-i:忽略字母大小写
7、压缩和解压类
(1)gzip 和 gunzip 指令
基本语法:gzip 文件(压缩文件,压缩为 *.gz)
gunzip 文件.gz(解压缩)
(2)zip 和 unzip 指令
基本语法:zip [选项] xxx.zip 将要压缩的内容(压文件和目录)
unzip [选项] xxx.zip(解压)
zip 常用选项:
-r:递归压缩,压缩目录
unzip 常用选项:
-d 目录:指定解压后文件的存放目录
(3)tar 指令,是打包指令,打包后的文件是,xxx.tar.gz
基本语法:tar [选项] xxx.tar.gz 打包内容
常用选项:
-c:产生 .tar 打包文件
-v:显示详细信息
-f:指定压缩后的文件名
-z:打包同时压缩
压缩:-zcvf
解压:-zxvf
七、组管理和权限管理
1、介绍
在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有所有者、所在组、其他组的概念
2、文件/目录所有者
(1)查看文件的所有者
ls -ahl
(2)修改文件的所有者
chown 用户名 文件名
-R:若是目录则递归生效
3、文件/目录所在组
(1)查看文件/目录所在组
ls -ahl
(2)修改文件所在的组
chgrp 组名 文件名
-R:若是目录则递归生效
4、改变用户所在组
在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理员权限可以改变某个用户所在的组
(1)改变用户所在组
usermod -g 新组名 用户名
usermod -g 目录名 用户名,改变该用户登录的初始目录,但首先用户需要有进入到新目录的权限
5、权限的基本介绍
ls -l 中显示的内容如下:-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
0-9位说明
(1)第 0 位确定文件类型
l 是链接,相当于快捷方式
d 是目录,相当于文件夹
c 是字符文件,鼠标、键盘
b 是块设备,如硬盘
1-3位确定所有者,4-6位所在组拥有该文件的权限,7-9其他组用户拥有该文件的权限
(2)rwx 作用到文件
① [r]代表可读:可以读取、查看
② [w]代表可写
③ [x]代表可执行
(3)rwx 作用到目录
① [r]代表可读:可以读取、ls 查看目录内容
② [w]代表可写:可以修改,对目录内创建、删除、重命名目录
③ [x]代表可执行:进入该目录
(4)用数字表示权限
r=4,w=2,x=1
6、修改权限
u:所有者、g:所在组、o:其他组、a:所有人
(1)chmod u=rwx,g=rx,o=x 文件/目录名
(2)chmod o+w 文件/目录名
(3)chmod a-x 文件/目录名
(4)通过数字变更权限
chmod 751 文件/目录名
八、crond 任务调度
crontab 进行定时任务的设置
1、概述
任务调度:是指系统在某个时间执行的特定的命令或程序
任务调度分类:
① 系统工作:有些重要的工作必须周而复始的执行,如病毒扫描
② 个别用户工作:个别用户可能希望执行某些程序,如对 mysql 数组库的备份
2、基本语法
crontab [选项]
3、常用选项
-e:编辑 crontab 定时任务
-l:查询 crontab 任务
-r:删除当前用户所有的 crontab 任务
4、参数说明
第一个 *:一小时当中的第几分钟,0-59
第二个*:一天当中的第几个小时,0-23
第三个*:一个月中的第几天,1-31
第四个*:一年当中的第几个月,1-12
第五个*:一周当中的星期几,0-7(0与7都是星期天)
5、特殊符号的说明
*,代表任何时间。如第一个*代表一小时中每分钟都执行一次
,代表不连续的时间。如 0 8,12 * * * 代表每天 8:00与12:00 都执行一次
-,代表连续的时间范围。如 0 5 * * 1-6 代表周一到周六凌晨5:00执行命令
*/n,代表没隔多久执行一次
6、crond 相关指令
crontab -r,终止任务调度
crontab -l,列出当前有哪些任务调度
service crond restart,重启任务调度
7、at 定时任务
(1)介绍
① at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业作业队列
② 默认情况下,atd 守护进程每60s检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
③ at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务
(2)at 命令格式
at [选项] [时间]
ctrl+d,按两次结束 at 命令的输入
(3)at 时间定义
① 接受在当天的 hh::mm 式的时间制定
② 使用midnight,noon,teatime来指定时间
③ 指定命令执行的具体日期,格式为 month day 或 mm/dd/yy 或 dd.mm.yy,指定的日期必须跟在指定的时间后面,如:22:00 2023-9-8
④ 采用12小时制,am 与 pm
⑤ 使用相对计时法,格式为:now + count time-units,now是当前时间,time-units是时间单位,可以是minutes、hours、days、weeks,count是时间的数量,几天、几小时。如:
now + 5 minutes
⑥ 直接使用 today、tomorrow来指定命令的时间
(4)at 命令选项
-m:当指定的任务完成后,将给用户发送邮件,即使没有标准输出
-I:atq 的别名(查看系统中没有执行的工作任务)
-d:atrm 的别名(删除指定任务,如 atrm 5)
-v:显示任务将被执行的时间
-c:打印任务的内容到标准输出
-V:显示版本信息
-q<队列>:使用指定队列
-f<文件>:从指定文件读入任务而不是从标准输入读入
-t<时间参数>:以时间参数的形式提交要运行的任务
(5)实例
at 5pm + 2 days
atq
at now + 2 minutes
atrm 5
九、Linux 分区
1、介绍
(1)Linux 无论有几个分区,分给哪一目录使用,归根结底只有一个根目录,一个独立且唯一的文件结构,linux 中每个分区都是用来组成整个文件系统的一部分
(2)Linux 采用了一种叫“载入”的处理方法,将一个分区和一个目录联系起来
2、查看所有设备的挂在情况
命令:lsblk 或 lsblk -f
3、虚拟机增加硬盘
(1)在虚拟机设置中,在设备列表里添加硬盘。然后重启才能识别
(2)开始分区,分区命令
fdisk /dev/sdb
开始对 sdb 分区
m:显示命令列表
p:显示磁盘分区
n:新增分区
d:删除分区
w:写入并退出
注意:开始分区后输入 n ,新增分区,然后选择 p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入 w 写入分区并退出,若不保存退出,则输入q
(3)格式化磁盘,分区命令
mkfs -t ext4 /dev/sdb,其中 ext4 为分区类型
(4)进行挂载,将一个分区与一个目录联系起来
mount 设备名称 挂载目录,如 mount /dev/sdb1 /newdisk
unmount 设备名称/挂载目录,如 unmount /dev/sdb1
注:用命令行挂载重启后就会失效
(5)永久挂载,通过修改 /etc/fstab 实现,添加完成后,执行 mount -a,立即生效
4、磁盘情况查询
(1)查询系统整体磁盘使用情况
df -h
(2)查询指定目录的磁盘占用情况
du -h
-s:指定目录占用大小汇总
-h:带计量单位
-a:含文件
-c:列出明细的同时,增加汇总值
--max-depth=1:子目录深度
5、实用指令
(1)统计 /opt 文件夹下文件的个数
ls -l /opt | grep "^-" | WC -l
(2)统计 /opt 文件夹下目录的个数
ls -l /opt | grep "^d" | WC -l
(3)统计 /opt 文件夹下文件的个数,包括子文件夹里
ls -lR /opt | grep "^-" | WC -l
(4)统计 /opt 文件夹下目录的个数,包括子文件夹里
ls -lR /opt | grep “^d” | WC -l
(5)以树状显示目录结构,注意,若没有 tree ,则使用 yum install tree 安装
tree /home
十、进程管理
1、介绍
(1)在 linux 中,每个执行的程序都称为一个进程,每个进程都有一个 ID 号(pid)
(2)每个进程都可能以两种方式存在。前台与后台
(3)一般系统的服务都是以后台进程的方式存在,而且会常驻在系统中。直到关机才结束
2、显示系统执行的进程
ps -aux
-a:显示当前终端的所有进程信息
-u:以用户格式显示进程信息
-x:显示后台进程运行的参数
3、指令说明
USER:用户名称
PID:进程号
%CPU:进程占 cpu 的百分比
VSZ:进程占虚拟内存的大小(kb)
RSS:进程占用的物理内存的大小(kb)
TTY:终端名称
STAT:进程状态,S-睡眠、s-表示该进程是会话的先导进程、N-代表比普通优先级更低的优先级、R-正在运行、D-短期等待、Z-僵死进程、T-被跟踪或被停止
START:进程启动时间
TIME:进程使用 cpu 总时间
COMMAND:启动进程所用的命令和参数
4、终止进程 kill 和 killall
基本语法:kill [选项] 进程号
killall 进程名称
常用选项:
-9:表示强迫进程立即停止
5、实例,以全格式显示当前所有的进程,查看进程的父进程
ps -ef
-e:显示所有进程
-f:全格式
6、服务管理
(1)介绍
服务本质就是进程,但是运行在后台,通常会监听某个端口,等待其他程序的请求,因此又称为守护进程
(2)service 管理命令
service 服务名 [start | stop | restart | reload | status]
service管理的服务在 /etc/init.d 查看
(3)查看服务名
① ls -l /etc/init.d
② setup,可以看到所有服务
(4)chkconfig 指令
通过 chkconfig 命令可以给服务的各个运行级别设置自启动和关闭
基本语法:chkconfig 服务名 --list
chkconfig --level 5 服务名 on/off
注意:重启机器才会生效
(5)systemctl 管理指令
① systemctl [start | stop | restart | status] 服务名(即可生效,但不持久)
② systemctl list-unit-files [| grep 服务名](查看服务的开机启动状态)
③ systemctl enable 服务名(设置服务开机启动,永久生效)
④ systemctl disable 服务名(关闭服务开机启动,永久生效)
⑤ systemctl is-enabled 服务名(查询某个服务是否自启动)
(6)打开或关闭指定端口
在生产环境中,需将防火墙打开,而打开了那么外部请求数据包就不能跟服务器监听端口通讯。这时要打开指定端口。
① firewall 指令
打开端口:firewall-cmd --permanent --add-port=端口号/协议
关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
重新载入,才能生效:firewall-cmd --reload
查询端口是否开放:firewall-cmd --query-port=端口号/协议
(7)动态监控进程
基本语法:top [选项]
注意:top 与 ps 很相似,但 top 与 ps 最大不同在于,top 执行一段时间可以更新正在运行的进程
① 交互操作说明
P:以 cpu 使用率排名(默认)
M:以内存使用率排序
N:以 PID 排序
q:退出 top
② 应用
监视特定用户:1> 输入top,按回车
2> 输入 u,按回车
3> 输入用户名,即可
终止指定进程:1> 输入 top,按回车
2> 输入 k ,按回车
3> 输入 PID ,即可
(8)监控网络状态
基本语法:netstat [选项]
常用选项:
-an:按一定顺序排列输出
-p:显示哪个进程在调用
十一、rpm 包的管理
1、rpm 包的其他查询指令
rpm -qa,查询安装的所有 rpm 软件包
rpm -q 软件包名,查询软件包是否安装
rpm -qi 软件包名,查询软件包信息
rpm -ql 软件包名,查询软件包中的文件
rpm -qf 文件全路径名,查询文件所属的软件包
2、卸载 rpm 包
rpm -e RPM包的名称
注意,如果其他软件包依赖于要卸载的软件包,卸载,卸载时会产生错误信息,若执意
rpm -e -nodepstoorpm
3、关于 yum
(1)介绍
yum是 shell 前端软件包管理器。基于 RPM 包管理,能从指定服务器自动下载 RPM 包且安装,可自动处理依赖关系,并且以此安装所有依赖的软件包
(2)基本指令
yum list | grep xxx
yum install xxx
十二、Shell 编程
1、介绍
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 shell 来启动、挂起、停止甚至是编写一些程序
2、脚本格式要求
(1)脚本以 #!/bin/bash 开头
(2)脚本需要有可执行权限
3、shell 的变量
(1)shell 变量介绍
① Linux Shell 中的变量分为,系统变量和用户自定义变量
② 系统变量:$HOME、$PWD、$SHELL等
如:echo $HOME
③ 显示当前 shell 中所有变量:set
(2)shell 变量的定义
① 定义变量:变量名=值
② 撤销变量:unset 变量名
③ 声明静态变量:readonly 变量
注:静态变量不能 unset
④ 定义变量的规则
1> 变量名可由字母、数字、下划线组成,但不能以数字开头
2> 等号两侧不能有空格
3> 变量名一般习惯为大写
⑤ 将命令的返回值赋给变量
A=`date` 或 A=$(date)
4、设置环境变量
基本语法
export 变量名=变量值(将shell变量输出为环境变量/全局变量)
source 配置文件(让修改后的配置文件立即生效)
echo $变量名(输出环境变量的值)
注意:在输出环境变量前,需让其生效:source /etc/profile
shell 脚本的多行注释:
:<<!
内容
!
5、位置参数变量
(1)介绍
在执行一个 shell 脚本时,若希望获取到命令行的参数信息,即可使用位置参数变量
(2)基本语法
① $n,(n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,要用大括号包含,${10})
② $*,(代表命令行中所有参数,把所有参数看成一个整体)
③ $@,(代表命令行中所有参数,把每个参数区分对待)
④ $#,(代表命令行中参数的个数)
6、预定义变量
(1)shell 设计者事先已经定义好的变量,可直接在 shell 脚本中使用
(2)基本语法
$$,(当前进程的进程号)
$!,(后台运行的最后一个进程的进程号)
$?,(最后一次执行命令的返回状态,0代表正确执行,否则执行不正确)
7、运算符
基本语法
(1)$((运算式)) 或 $[运算式] 或 expr m + n
(2)注意 expr 运算符间要有空格
(3)expr \*,/,%(乘,除,取余)
8、条件判断
(1)基本语法
[ condition ](注意condition前后要有空格)
(2)判断语句
① = 字符串比较
② 两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
③ 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
④ 按照文件类型进行判断
-f 文件存在,并且是一个常规的文件
-e 文件存在
-d 文件存在,并且是一个目录
9、流程控制
(1)if 判断
if [ condition ]
then
代码
elis [ condition ]
then
代码
else
代码
fi
(2)case 语句
case $变量名 in
"1")
代码
;;
"2")
代码
;;
*)
代码
;;
esac
(3)for 循环
#方式一
for 变量 in 值1 值2 值3
do
代码
done
#方式二
for ((初始值; 循环控制条件; 变量变化))
do
代码
done
10、read 读取控制台输入
(1)基本语法:read (选项) (参数)
(2)选项
-p:指定读取时的提示符
-t:指定读取时等待的时间(s),若超时,就不再等待
(3)参数
变量:指定读取值的变量名
11、函数
(1)介绍
shell 编程和其他编程语言一样,有系统函数和自定义函数
(2)系统函数
① basename 基本语法
功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
② dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname [文件的绝对路径]
(3)自定义函数
function funname()
{
action;
return int;
}
调用即直接写函数名:funname 值
总结实战
需求:每天凌晨两点半自动备份数据库
思路:通过需求可知在每天两点半自动执行,因此必然会用到任务调度。那接下来我们只需要编写备份数据库的代码即可,那么如何编写呢?首先,我们要有一个目录专门用来存放备份数据的,其次数据库的备份要调用数据库备份的命令,在有备份文件后,最好是通过打包压缩来存放,同时考虑到,该脚本每天都执行,时间久了就会有很多用不上的备份文件,这些文件是可以清除的,因此每次脚本执行时都删除10天前的备份文件。好啦,现在思路也有了。开始写代码吧
#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#获取当前时间
DATETIME=$(date +%Y-%m-%d_%H:%M:%S)
#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=输入自己的密码
#要备份的数据库
DATABASE=cystudy
#创建备份目录,如果不存在就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases=${DATABASE} | gzip > "${BACKUP}/${DATETIME}/$DATETIME.sql.gz"
#将备份文件打包
tar -zcvf $DATETIME.tar.gz ${DATETIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
#删除10前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库 ${DATABASE} 成功"
脚本写好了,接下来让我们编辑任务调度吧
30 2 * * * /usr/sbin/mysql_db_backup.sh