linux
Linux基础篇 入门
目录 | 意义 |
---|---|
/bin | 是Binary的缩写,这个目录存放着最经常使用的命令 |
/sbin | s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序 |
/home | 存放普通用户的主目录,在linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的 |
/root | 该目录为系统管理员,也称作超级权限者的用户主目录 |
/lib | 系统开机所需要最基本的动态连接共享库,其作用类似于windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库 |
/lost+found | 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件 |
/etc | 所有的系统管理所需要的配置文件和子目录my.conf |
/usr | 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录 |
/boot | 存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件 |
/proc | 这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息 |
/srv | service缩写,该目录存放一些服务启动之后需要提取的数据 |
/sys | 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 |
/tmp | 这个目录是用来存放一些临时文件的 |
/dev | 类似于windows的设备管理器,把所有的硬件用文件的形式存储 |
/media | linux系统会自动识别一些设备,例如U盘,光驱等等,当识别后,linux会把识别的设备挂载到这个目录下 |
/mnt | 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里面的内容了。D://Share |
/opt | 这是给主机额外安装软件所摆放的目录,如安装ORACLE数据库就可放在该目录下 |
/usr/local | 这是另一个给主机额外安装软件所安装的目录,一般是用过编译源码方式安装的程序 |
/var | 这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件 |
/selinux | SELINUX是一种安全子系统,它能控制程序只能访问特定文件 |
Linux实操篇
Vi Vim
模式名 | 可完成的指令 |
---|---|
正常模式 | 可使用快捷键,如上下左右,复制粘贴 |
插入模式 | 按下i,I,o,O,a,A,r,R进入,一般来说按i即可 |
命令行模式 | 提供相关指令,完成读取、存盘、替换、离开、Vim、显示行号等操作 |
vim快捷键功能 | 用法及操作 |
---|---|
拷贝当前行 | yy完成拷贝,p粘贴(拷贝当前行向下的5行 5yy) |
删除当前行 | dd,删除当前行向下的5行 5dd |
查找单词 | 命令行下 /关键字,回车则查找,输入n则继续查找下一个 |
设置/区校行号 | 命令行:set nu和:set nonu |
回到文档首行和尾行 | 正常模式下,最末行 G,最首行 gg |
撤销 | 正常模式下输入u |
光标移动到指定行 | 1.显示行号:set nu 2.输入行号 3.输入shift+g |
关机&重启命令
shutdown用法 | 意义 |
---|---|
shutdown -h now | 表示立即关机 |
showdown -h 1 | 表示一分钟后 |
shutdown -r now | 立即重启 |
halt | 直接使用,效果等价于关机 |
reboot | 立即重启 |
sync | 把内存的数据同步到磁盘 |
logoout | 注销用户(图形界面无效),在运行级别3有效 |
用户管理
用户操作 | 方法 |
---|---|
添加用户 | useradd [选项] 用户名,当创建用户成功后,会自动创建和用户同名的家目录,也可以通过useradd -d 指定目录 新的用户名,给新创建的用户指定家目录 |
指定/修改密码 | passwd 用户名 |
删除用户(保留家目录) | userdel 用户名(一般保留家目录) |
删除用户(删除家目录) | userdel -r 用户名 |
查询用户信息 | id 用户名 |
切换用户 | su - 用户名(exit回退到原来用户)从权限高的用户切换到权限低的用户不需要输入密码,反之需要 |
查看当前用户/登陆用户 | whoami/who am i |
增加组 | groupadd 组名 |
删除组 | groupdel 组名 |
创建用户时直接加上组 | useradd -g 用户组 用户名 |
修改用户组 | usermod -g 用户组 用户名 |
用户和组的相关文件
文件 | 意义 | 每行含义 |
---|---|---|
/etc/passwd | 用户(user)的配置文件,记录用户的各种信息 | 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登陆shell |
/etc/shadow | 口令的配置文件 | 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 |
/etc/group | 组(group)的配置文件,记录linux包含的组的信息 | 组名:口令:组标识号:组内用户列表 |
实用指令
指定运行级别
级别 | 意义 |
---|---|
0 | 关机 |
1 | 单用户(找回丢失密码) |
2 | 多用户无网络服务 |
3 | 多用户有网络服务(使用最多) |
4 | 保留 |
5 | 图形界面 |
6 | 重启 |
系统的运行级别配置文件/etc/inittab
切换到指定运行级别的指令:init[0123456]
面试题:如何找回root密码?
思路:进入到单用户模式,然后修改密码。因为进入单用户模式,root不需要密码就可以登陆。
在引导时输入enter;输入e;(选中kernel)输入e;在此行最后输入 空格 1;再输入enter;再输入b进入单用户模式;使用passwd root修改密码
帮助指令
当我们对某个指令不熟悉时,可以使用帮助指令来了解这个指令的具体用法
指令 | 格式及描述 |
---|---|
man获得帮助信息 | man [命令或配置文件](功能描述:获得帮助信息) |
help指令 | help 命令(功能描述:获得shell内置命令的帮助信息) |
www.google.com |
文件目录类
指令 | 基本语法 | 功能描述 |
---|---|---|
pwd | pwd | 显示当前工作目录的绝对路径 |
ls | ls [选项] [目录或是文件] | 常用选项:-a:显示当前目录所有的文件和目录,包括隐藏的;-l:以列表的方式显示信息 可以搭配使用 |
cd | cd [参数] | 切换到指定目录 常用参数:绝对路径和相对路径 cd ~或cd 回到自己的家目录;cd … 回到当前目录的上一级目录 |
mkdir | mkdir [选项] 要创建的目录 | make directory常用选项:-p 创建多级目录 |
rmdir | rmdir [选项] 要删除的空目录 | rmdir删除的是空目录,如果目录下有内容时无法删除,提示:如果需要删除非空目录,需要使用rm -rf 要删除的目录 |
touch | touch 文件名称 | 创建空文件,可以一次性创建多个文件 |
cp | cp [选项] source dest | 拷贝文件至指定目录,常用选项:-r 递归复制整个文件夹,强制覆盖不提示的方法:\cp |
rm | rm [选项] 要删除的文件或目录 | 移除文件或目录,常用选项:-r:递归删除整个文件夹;-f:强制删除不提示 |
mv | mv oldNameFile newNameFile | 重命名 |
mv 文件名 要移动到的目录 | 移动文件 | |
cat | cat [选项] 要查看的文件 | 查看文件内容,以只读的方式打开,常用选项:-n 显示行号,为了浏览方便,一般会带上管道命令 |
more | more 要查看的文件 | more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容,more指令中内置了若干快捷键,空格按页,enter按行 |
less | less 要查看的文件 | less指令用来分屏查看文件内容,但是比more指令更强大,支持各种终端显示。less指令在显示文件内容时,并不是一次将整个文件加载之后显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率 |
> | ls -l >文件 | 输出重定向,将列表的内容写入文件中,覆盖写 |
cat 文件1>文件2 | 将文件1的内容覆盖到文件2 | |
>> | ls -al >>文件 | 追加,将列表内容追加到文件的末尾 |
echo “内容”>>文件 | ||
echo | echo [选项] [输出内容] | 输出内容到控制台 |
head | head [选项] 文件 | 用于显示文件的开头部分内容,默认情况下head指令显示文件的前十行内容,head -n 5 文件 :查看文件头5行内容,5可以是任意数 |
tail | tail [选项] 文件 | 用于输出文件中尾部的内容,默认情况下显示文件的后10行内容,tail -n 5 文件 :查看后5行内容;tail -f 文件 :实时追踪该文档的所有更新 |
ln | ln -s [原文件或目录] [软链接名] | 给原文件创建一个软链接。软链接也叫符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径。当我们使用pwd查看目录时,仍然看到的是软链接所在目录 |
history | history | 查看已经执行过历史命令,也可以执行历史指令,histroy 50:查看近50条命令,!100:执行第100条指令 |
时间日期类
指令 | 基本语法 | 功能描述 |
---|---|---|
date | date | 显示当前日期 |
date +%Y | 显示当前年份 | |
date +%m | 显示当前月份 | |
date +%d | 显示当前是哪一天 | |
date “+%Y-%m-%d %H:%M:%S” | 显示年月日时分秒 | |
date -s 字符串时间 | 设置时间 | |
cal | cal [选项] | 不加选项,显示本月日历 |
搜索查找类
指令 | 基本语法 | 功能描述 |
---|---|---|
find | find [搜索范围] [选项] | 从指定目录向下递归地遍历其各个子目录,将满足条件地文件或目录显示在终端,选项说明:-name<查询方式> 按照指定的文件名查找模式查找文件 ;-user<用户名> 查找属于指定用户名所有文件 ;-size<文件大小> 按照指定的文件大小查找文件 |
locate | locate 搜索文件 | locate指令可以快速定位文件路径。locate指令利用事先建立的系统中的所有文件名称及路径的locate数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻。特别说明:由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库 |
grep和管道符号| | grep [选项] 查找内容 源文件 | 过滤查找,管道符表示将前一个命令的处理结果输出传递给后面的命令处理。常用选项: -n 显示匹配行及行号;-i 忽略字母大小写 |
压缩和解压缩类
压缩指令 | 基本语法 | 功能描述 | 解压指令 | 基本语法 | 功能描述 |
---|---|---|---|---|---|
gzip | gzip 文件 | 压缩文件,只能将文件压缩为*.gz文件,当我们使用gzip对文件压缩后,不会保留原来的文件 | gunzip | gunzip 文件.gz | 解压缩文件命令,当我们使用gunzip对文件解压缩后,同样不会保留原来的文件 |
zip | zip [选项] XXX.zip 将要压缩的内容 | 压缩文件和目录,常用选项:-r 递归压缩,即压缩目录 | uzip | uzip [选项] XXX.zip | 解压缩文件,常用选项:-d<目录> 指定解压后文件的存放目录 |
tar指令是打包指令,最后打包的文件是.tar.gz的文件
tar [选项] XXX.tar.gz 打包的内容 (打包目录)
-c:产生.tar打包文件
-v:显示详细信息
-f:指定压缩后的文件名
-z:打包同时压缩
-x:解包.tar文件
tar -zcvf a.tar.gz a1.txt a2.txt
tar -zcvf myhome.tar.gz /home/
tar -zxvf a.tar.gz
压缩到的目录必须存在,否则会报错
组管理和权限管理
指令 | 意义 |
---|---|
ls -ahl | 查看文件所有者 |
chown 用户名 文件名 | 修改文件所有者 |
chgrp 组名 文件名 | 修改文件所在组 |
usermod -g 组名 用户名 | 改变用户所在组 |
usermod -d 目录名 用户名 | 改变该用户登陆的初始目录 |
-rw-r–r-- 1 root root 103 Jun 10 16:45 Hello.java
0-9位说明(可用数字表示:r=4,w=2,x=1)
- 第0位确定文件类型
- -:普通文件
- d:目录
- l:软链接
- c:字符设备[键盘,鼠标]
- b:块文件,硬盘
- 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。 --User
- 第4-6位确定所属者(同用户组的)拥有该文件的权限。 --Group
- 第7-9位确定其他用户拥有该文件的权限。 --Other
第10位说明 文件:硬链接数或目录:子目录数
rwx作用详解
文件 | 目录 | |
---|---|---|
r可读read | 可以读取,查看 | 可以读取,ls查看目录内容 |
w可写write | 可以修改,但是不代表可以删除文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件 | 可以修改,目录内创建+删除+重命名目录 |
x可执行execute | 可以被执行 | 可以进入该目录 |
修改权限chmod
修改文件或者目录的权限
第一种方式:+、-、=变更权限
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
- chmod u=rwx,g=rx,o=x 文件目录名
- chmod o+w 文件目录名
- chmod a-x 文件目录名
第二种方式:通过数字变更权限
r=4,w=2,x=1 rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名 相当于 chmod 751 文件目录名
修改文件所有者chown
chown newowner file 改变文件的所有者
chown newowner:newgroup file 改变用户的所有者和所有组
-R 如果是目录,则使其下所有子文件或目录递归生效
修改文件所在组chgrp
chgrp newgroup file 改变文件的所有组
任务调度crond
任务调度是指系统在某个时间执行的特定的命令或程序
基本语法:crontab [选项]
常用选项:
- -e 编辑crontab定时任务;
- -l 查询crontab任务;
- -r 删除当前用户所有的crontab任务
- service crond restart 重启任务调度
参数说明
5个占位符的说明
项目 | 含义 | 范围 |
---|---|---|
第一个* | 一小时当中的第几分钟 | 0-59 |
第二个* | 一天当中的第几小时 | 0-23 |
第三个* | 一个月当中的第几天 | 1-31 |
第四个* | 一年当中的第几月 | 1-12 |
第五个* | 一周当中的星期几 | 0-7(0和7都代表星期日) |
特殊符号的说明
特殊符号 | 含义 |
---|---|
* | 代表任何时间。比如第一个“*”代表一小时中每分钟都执行一次的意思 |
, | 代表不连续的时间。比如“0 8,12,16 * * *”代表在每天的8:00,12:00,16:00都执行一次命令 |
- | 代表连续的时间范围。比如“0 5 * * 1-6”代表在周一到周六的凌晨5:00执行命令 |
*/n | 代表每隔多久执行一次。比如“/10 * * * *”代表每隔10分钟就执行一次 |
案例:每隔一分钟将当前日期信息,追加到/tmp/mydate文件中
- 先编写一个文件 /home/mytask.sh
date >> /tmp/mydate - 给mytask.sh一个可执行权限
chmod 744 /home/mytask.sh - crontab -e
- */1 * * * * /home/mytask.sh
- 成功
磁盘分区、挂载
分区方式 | mbr | gpt |
---|---|---|
1.最多支持四个主分区 2.系统只能安装在主分区 3.扩展分区要占一个主分区 4.MBR最大只支持2TB,但拥有最好的兼容性 | 1.支持无限多个主分区(但操作系统可能限制,比如windows下最多128个分区) 2.最大支持18EB的大容量(1EB=1024PB,1PB=1024TB) 3.windows7 64位以后支持gpt |
linux分区
硬盘说明
- linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘
- 对于IDE硬盘,驱动器标识符位“hdx”,其中hd表明分区所在设备的类型,这里是指IDE硬盘了,x为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),代表分区,其四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。例,hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为第二个IDE硬盘上的第二个主分区或扩展分区
- 对于SCSI硬盘则标识为“sdx~”,SCSI硬盘是用sd来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样
使用lsblk或lsblk -f指令查看当前系统的分区情况
挂载
如何增加一块硬盘?
- 虚拟机添加硬盘
- 分区 分区命令 fdisk /dev/sdb 开始对/sdb分区
- m 显示命令列表
- p 显示磁盘分区 同fdisk -l
- n 新增分区
- d 删除分区
- w 写入并退出
说明:开始分区后输入n,新增分区,然后选择p,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q
- 格式化 分区命令:mkfs -t ext4 /dev/sdb1 其中ext4是分区类型
- 挂载 将一个分区与一个目录联系起来
- mount 设备名称 挂载目录 例如:mount /dev/sdb1 /newdisk
- umount 设备名称或者挂载目录 例如:umount /dev/sdb1或者umount /newdisk
- 设置可以自动挂载 通过修改/etc/fstab实现挂载 添加完成后 执行mount -a 即可生效
磁盘情况查询
- 查询系统整体磁盘使用情况df -l,df -h,df -lh
- 查询指定目录的磁盘占用情况du -h /目录
- 查询指定目录的磁盘占用情况,默认为当前目录
- -s:指定目录占用大小汇总
- -h:带计量单位
- -a:含文件
- -max-depth=1:子目录深度
- -c:列出明细的同时,增加汇总值
- 工作实用指令
- 统计/home文件夹下文件的个数 ls -l /home | grep “^-” | wc -l
- 统计/home文件夹下目录的个数 ls -l /home | grep “^d” | wc -l
- 统计/home文件夹下文件的个数,包括子文件夹里面的 ls -lR /home | grep “^-” | wc -l
- 统计/home文件夹下目录的个数,包括子文件夹里面的 ls -lR /home | grep “^d” | wc -l
- 以树状显示目录结构 yum install tree ; tree 目录
网络配置
指定固定的ip地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0
service network restart
进程管理
显示系统执行的进程
ps
命令 | 功能 |
---|---|
ps -a | 显示当前终端的所有进程信息 |
ps -u | 以用户的格式显示进程信息 |
ps -x | 显示后台进程运行的参数 |
ps -aux | grep xxx | |
ps -ef | grep xxx | 以全格式(-f)显示当前所有的进程(-e),查看进程的父进程 |
终止进程
kill [选项] 进程号:通过进程号杀死进程
killall 进程名称:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
常用选项:-9 表示强迫进程立即停止
- 踢掉非法用户
- ps -aux | grep sshd
- kill xxx(user)
- 终止远程登录服务sshd,在适当时候再次重启sshd服务
- kill xxx(sshd)
- 终止多个gedit编辑器
- killall xxx(进程名称)
- 强制杀掉一个终端
- ps -aux | grep sshd
- kill -9 xxx(/bin/bash)
查看进程树
pstree [选项]
常用选项:
-p:显示进程的pid
-u:显示进程的所属用户
服务(service)管理
服务本质就是进程,但是是运行在后台的,通常会监听某个端口,等待其他程序的请求,比如mysql,sshd,防火墙等,因此我们又称为守护进程,是linux中非常重要的知识点
service 服务名 [start | stop | restart | reload | status]
在Centos7.0后不再使用service,而是systemctl
ls -l /etc/init.d/:列出系统有哪些服务
开机的流程:开机 -> BIOS -> /boot -> init进程 -> 运行级别 -> 运行级对应的服务
chkconfig
通过chkconfig命令可以给每个服务的各个运行级别设置自启动/关闭
基本语法:
- 查看服务 chkconfig --list | grep xxx
- chkconfig 服务名 --list
- chkconfig --level 5 服务名 on/off 修改某个服务在某个级别下是否自启动
- chkconfig 重新设置服务后自启动或关闭,需要重启机器reboot才能生效
动态监控进程
top与ps命令很相似,它们都用来显示正在执行的进程。top与ps最大的不同之处在于top在执行一段时间可以更新正在运行的进程。
基本语法:top [选项]
选项说明
选项 | 功能 |
---|---|
-d 秒数 | 指定top命令每隔几秒更新,默认是3秒,在top命令的交互模式当中可以执行的命令 |
-i | 使top不显示任何闲置或者僵死进程 |
-p | 通过指定监控进程ID来仅仅监控某个进程的状态 |
交互操作说明
操作 | 功能 |
---|---|
P | 以CPU使用率排序,默认就是此项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
q | 退出top |
案例1.监视特定用户
top:输入此命令,按回车键,查看执行的进程
u:输入“u”回车,再输入用户名,即可
案例2.终止特定进程
top:输入此命令,按回车键,查看执行的进程
k:输入“k”回车,再输入要结束的进程ID号
监控网络状态
查看系统网络情况 netstat
基本语法 netstat [选项]
查看所有netstat -anp | more
查看特定服务netstat -anp | grep xxx
选项说明:
-an:按一定顺序排列输出
-p:显示哪个进程在调用
RPM和YUM
RPM
RPM:一种用于互联网下载包的打包及安装工具,它包含在某些linux分发版中,它生成距有.RPM扩展名的文件。类似于windows的setup.exe
指令 | 功能 |
---|---|
rpm -qa | 查询所安装的所有rpm软件包 |
rpm -qa | more | |
rpm -qa | grep xxx | |
rpm -q 软件包名 | 查询软件包是否安装 |
rpm -qi 软件包名 | 查询软件包信息 |
rpm -ql 软件包名 | 查询软件包中的文件 |
rpm -qf 文件全路径名 | 查询文件所属的软件包 |
rpm -e RPM包的名称 | 卸载RPM包 |
rpm -e --nodeps RPM包的名称 | 卸载RPM包,强制删除 |
rpm -ivh RPM包全路径名 | 安装RPM包,参数说明:i=install安装,v=verbose提示,h=hash进度条 |
YUM
YUM:Yum是一个Shell前端软件包管理器,基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
指令 | 功能 |
---|---|
yum list | grep xx | 软件列表,查询yum服务器是否有需要安装的软件 |
yum install xxx | 下载安装,安装指定的yum包 |
JavaEE定制篇
jdk
tar -zxvf jdk-8u211-linux-x64.tar.gz
cd /opt/jdk1.8.0_211/bin
vim /etc/profile
JAVA_HOME=/opt/jdk1.8.0_211
PATH=/opt/jdk1.8.0_211/bin:$PATH
export JAVA_HOME PATH
source /etc/profile或logout注销
tomact
tar -zxvf apache-tomcat-9.0.21.tar.gz
cd /opt/apache-tomcat-9.0.21/bin进入到bin目录或配环境变量
./startup.sh
http://localhost:8080
systemctl status iptables
yum install iptables-services
service iptables status
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT(yy p复制)(开放8080端口)
服务器需设置安全组规则,开放8080端口
eclipse
tar -zxvf eclipse-jee-2019-03-R-linux-gtk-x86_64.tar.gz
cd eclipse
./eclipse或创建一个快捷方式
mysql
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
tar -zxvf mysql-8.0.16.tar.gz
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc
-DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306
-DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENHINE=1
-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
Shell编程
硬件 -> 内核 -> Shell命令解释器 -> 应用程序
Shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序
编写一个Shell
vim myShell.sh
#!/bin/bash
echo "hello,world!"
脚本的常用执行方式:
1. 赋予权限,输入脚本的相对路径或绝对路径
chmod 755 myShell.sh
./myShell.sh或/root/shell/myShell.sh
2. sh+脚本,不用赋予权限(不推荐)
sh ./myShell.sh或sh /root/shell/myShell.sh
Shell变量
介绍
- Linux Shell中的变量分为系统变量和用户自定义变量。
- 系统变量:$HOME、$PWD、$SHELL、$USER等等,比如:echo $HOME(输出系统变量)等等
- 显示当前shell中所有变量:set
定义
-
定义变量:变量=值
-
撤销变量:unset 变量
-
声明静态变量:readonly 变量,注意:不能unset
A=100 echo "A=$A" unset A echo "A=$A" readonly A=99 echo "A=$A" unset A (./myShell.sh: line 14: unset: A: cannot unset: readonly variable) echo "A=$A"
-
定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
- 等号两侧不能有空格
- 变量名称一般习惯为大写
-
将命令的返回值赋给变量
-
反引号
RESULT=`ls -l /home`
echo $RESULT -
等价于反引号
MY_DATE= ( d a t e ) e c h o " d a t e = (date) echo "date= (date)echo"date=MY_DATE"
-
设置环境变量
- 基本语法
- export 变量名=变量值(将shell变量输出为环境变量)
- source 配置文件(让修改后的配置信息立即生效)
- echo $变量名(查询环境变量的值)
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
基本语法:
- $n:n位数字,$0代表命令本身,$1-$9代表第一到九个参数,十以上的参数需要用大括号包含${10}
- $*:代表命令行中所有的参数,$*把所有的参数看成一个整体
- $@:也代表命令行中所有的参数,不过$@把每个参数区分对待
- $#:代表命令行中所有参数的个数
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法:
- $$:当前进程的进程号PID
- $!:后台运行的最后一个进程的进程号PID
- $?:最后一次执行的命令的返回状态。如果这个变量的值为0.证明上一个命令正确执行;如果非0,则执行不正确
运算符
-
“$((运算式))“或”$[运算式]”
-
expr m + n(注意expr运算符间要有空格)
-
expr m - n
-
expr \*,/,%
RESULT1=$(((2+3)*4)) echo "result1=$RESULT1" RESULT2=$[(2+3)*4] echo "result2=$RESULT2" TEMP=`expr 2 + 3` RESULT3=`expr $TEMP \* 4` echo "result3=$RESULT3" SUM=$[$1+$2] echo "SUM=$SUM"
条件判断
基本语法
[ condition ](注意condition前后要有空格)
非空返回true,可使用$?验证
常用判断条件
- 两个整数的比较
- =字符串比较
- -lt小于
- -le小于等于
- -eq等于
- -gt大于
- -ge大于等于
- -ne不等于
- 按照文件权限进行判断
- -r有读的权限
- -w有写的权限
- -x有执行的权限
- 按照文件类型进行判断
-
-f文件存在并且是一个常规文件
-
-e文件存在
-
-d文件存在并且是一个目录
if [ "ok" = "ok" ] then echo "equal" fi if [ 23 -gt 22 ] then echo "大于" fi if [ -e /root/shell/myShell.sh ] then echo "存在" fi
-
流程控制
if判断
if [ 条件判断式 ]
then
程序
fi
或
if[ 条件判断式 ]
then
程序
elif[ 条件判断式 ]
then
程序
fi
case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
实例:
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
for循环
基本语法1
for 变量 in 值1 值2 值3
do
程序
done
基本语法2
for((初始值;循环控制条件;变量变化))
do
程序
done
实例:
打印命令行输入的参数
使用 $*
for i in "$*"
do
echo "the num is $i"
done
使用$@
for j in "$@"
do
echo "the num is $j"
done
the num is 10 20 30
the num is 10
the num is 20
the num is 30
从1加到100的值输出显示
SUM=0;
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
while循环
基本语法1
while [ 条件判断式 ]
do
程序
done
实例:
从命令行输入一个数n,从1加到n的值为?
SUM=0;
i=0;
while [ $i -le $1 ]
do
SUM=$[ $SUM+$i ]
i=$[ $i+1 ]
done
echo "sum=$SUM"
输入输出
read读取控制台输入
基本语法
read (选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数
变量:指定读取值的变量名
实例:
读取控制台输入一个num值
read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"
读取控制台输入一个num值,在10秒内输入
read -t 10 -p "请输入一个数num2=" NUM2
echo "你输入的值是num2=$NUM2"
系统函数
basename基本语法
功能:返回完整路径最后/的部分,常用于获取文件名
basename [pathname][suffix]
basename [string][suffix]
basename命令会删掉所有的前缀包括最后一个"/"字符,然后将字符串显示出来
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
basename /root/shell/myShell.sh myShell.sh
basename /root/shell/myShell.sh .sh myShell
dirname基本语法
功能:返回完成路径最后"/"的前面的部分,常用于返回路径部分
dirname 文件绝对路径
dirname /root/shell/myShell.sh /root/shell
自定义函数
[function] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname[值]
实例:
function getSum(){
SUM=$[$n1+$n2]
echo "和是$SUM"
}
read -p "请输入一个数num1=" n1
read -p "请输入二个数num2=" n2
getSum $n1 $n2
综合案例
每天凌晨2:10备份数据库atguiguDB到/data/backup/db
备份开始和备份结束都能够给出相应的提示信息
备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2019_06_12_145646.tar.gz
在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
#! /bin/bash
#完成数据库的定时备份
#备份的路径
BACKUP=/data/backup/db
#当前时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
echo ${DATETIME}
echo "=========开始备份=========="
echo "=========备份的路径是 $BACKUP/$DATETIME.tat.gz"
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
#备份数据库名
DATABASE=atguiguDB
#创建备份的路径
#如果备份的路径文件夹存在,就使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行mysql的备份数据库指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "==========备份成功==========="
crontab -e
10 2 * * * /mysql_db_backup.sh