一、Linux基础
1.1 Linux(CentOS)和VM的安装
1.1.1 开启windows虚拟化
- 任务管理器–CPU查看虚拟化是否开启
1.1.2 安装VM和CentOS
- 安装VMware Workstation Pro
- 创建虚拟机(空间)
- 安装CentOS
1.1.3 安装CentOS注意事项
- 步骤:
- 打开VM
- 创建虚拟机–典型–稍后安装操作系统–Linux(CentOS 64位)–自定名称和空间–下一步(20G)–完成
- 编辑虚拟机设置
- 内存->2G
- 处理器->根据自己电脑配置
- 网络适配器->NAT
- 1.桥连接, Linux可以和其它的系统通信。但是可能造成ip冲突
- 2.NAT: 网络地址转换方式: linux可以访问外网,不会造成ip冲突。(推荐)
- 3.主机模式:你的linux是一个独立的主机,不能访问外网
- CD/DVD(IDE)–使用ISO映像文件–自己下载位置
- 开启此虚拟机
-
Install CentOS 7–简体中文
-
软件选择:
-
安装位置–我要配置分区–完成
-
点击"+"
- /boot–1024
- swap–2048
- /–17408
- 完成–接收更改
-
网络和主机名
- 以太网打开
- 自己取主机名–应用
- 完成
-
开始安装
- ROOT密码–自己设置密码–完成
- 创建用户–填写信息–完成
-
1.2 vmtools安装
1.2.1 作用
- 可以直接粘贴命令在windows和centos系统之间
- 可以设置windows和centos的共享文件夹
1.3 Xshell 远程连接
- 打开–新建会话–起名字–主机(CentOS的ip)
1.4 远程连接失败查询(初级)
1.4.1 检查道路是否通畅
ping
ip或域名
[jerry@jerry ~]$ ping 192.168.254.132
PING 192.168.254.132 (192.168.254.132) 56(84) bytes of data.
64 bytes from 192.168.254.132: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 192.168.254.132: icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from 192.168.254.132: icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from 192.168.254.132: icmp_seq=4 ttl=64 time=0.073 ms
1.4.2 检查是否提供服务
- 即检查端口是否开启
telnet ip 端口
telnet 192.168.254.132 22
- 没有telnet需要下载
yum install telnet
[jerry@jerry ~]$ telnet 192.168.254.132 22
Trying 192.168.254.132...
Connected to 192.168.254.132.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4
1.5 Bash特点
1.5.1 Bash概述
- 命令解析器(shell)、替我们运行、解析指令
- 功能
- 执行命令
- 特殊符号
- 运行脚本(代码)
- …
1.5.2 Linux命令格式
命令 选项 参数
命令 Linux实现各种功能的指令
选项 option同一个命令的不同功能
参数 对象(处理文件、目录)
命令 选项 参数
rm -f /test.txt
1.5.3 文件相关命令
#ls list列表,查看目录下面的内容(只有名字)
[jerry@jerry ~]$ ls /
bin/ dev/ home/ lib64/ mnt/ proc/ run/ srv/ tmp/ var/
boot/ etc/ lib/ media/ opt/ root/ sbin/ sys/ usr/
[jerry@jerry ~]$ ls /etc/
abrt dnsmasq.d issue openldap services
adjtime dracut.conf issue.net opt sestatus.conf
#ls -l 查看详细信息 d代表目录
[jerry@jerry ~]$ ls -l /tmp/
总用量 32
-rw-r--r--. 1 root root 1148 8月 5 14:11 anaconda.log
drwxr-xr-x. 2 root root 18 8月 5 13:57 hsperfdata_root
-rw-r--r--. 1 root root 415 8月 5 14:10 ifcfg.log
#ls -la /fileName/显示 /root/ 目录中所有文件,包含隐藏文件
#以"."开头的文件或者目录就是隐藏文件
#cd change directory进入目录
cd /tmp
#pwd 显示当前所在位置
#cd ~ 快速回到根目录
#cd .. 上一级目录cd
#cd - 返回上一次所在目录
#tree 以树形显示目录内容
#centOS安装软件(熟悉)
yum install -y tree #需要虚拟机可以连网
1.6 Linux目录结构
-
/bin (/user/bin,/user/local/bin)
- 是Binary的缩写,这个目录存放着最经常使用的命令
-
/sbin (/user/sbin,/user/local/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内核中新出现的一个文件系统sysfs
-
/tmp
- 临时文件
-
/dev
- 类似于windows的设备管理器,把所有的硬件用文件的形式存储
-
/media
- linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后, linux会把识别的设备挂载到这个目录下
-
/mnt
- 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上然后进入该目录就可以查看里的内容了。d:/myshare
-
/opt
- 这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可放到该目录下。默认为空
-
/usr/local [常用]
- 这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序
-
/var [常用]
- 这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件
-
/selinux [security-enhanced linux]
- SELinux是一种安全子系统, 它能控制程序只能访问特定文件,有三种工作模式,可以自行设置.
1.7 vi和vim
Vim具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,
方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。Linux系统会内置vi文本编辑器
1.7.1 常用三种模式
-
正常模式
- 以vim打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用.
「上下左右」
按键来移动光标,你可以使用「删除字符」
或「删除整行」
来处理档案内容,也可以使用「复制、粘贴」
来处理你的文件数据。
- 以vim打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用.
-
插入模式
- 按下
i,I,o,O,a,A,r,R
等任何一个字母之后才会进入编辑模式,一般来说按i
即可
- 按下
-
命令行模式
- 按下
esc
,再输入:
在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开vim、显示行号等的动作则是在此模式中达成的!
- 按下
-
案例,在Xshell中输入
vim Hello.java
,用vim编写这个文件- 进入后按下
i
进入编辑模式 - 编辑完成后按下
esc
- 输入
:
进入命令行模式 - 输入
:wq
(write quit)保存并退出
- 进入后按下
1.7.2 各种模式相互切换
1.7.3 快捷键
-
拷贝当前行(正常模式下输入)
yy
,拷贝当前行向下的5行5yy
, 并粘贴(输入p
)。 -
删除当前行
dd
,删除当前行向下的5行5dd
- 在文件中查找某个单词[
命令行下
输入/关键宇
,回车查找输入n就是查找下一个]
- 在文件中查找某个单词[
-
设置文件的行号,取 消文件的行号.[命令行下: set nu和:set nonu]
-
编辑/etc/profile文件,使用快捷键到该文档的最末行[G]和最首行[gg]
-
在一个文件中输入"hello",然后又撤销这个动作u
-
编辑/etc/profile文件,并将光标移动到20行shift+g
1.8 命令
1.8.1 关机和重启
- shutdown -h now 立该进行关机
- shutdown -h 1 “hello, 1分钟后会关机了”
- shutdown -r now 现在重新启动计算机
- halt 关机,作用和.上面一样。
- reboot 现在重新启动计算机
- sync 把内存的数据同步到磁盘。
- 注意细节
- 不管是重启系统还是关闭系统 ,首先要运行sync命令,把内存中的数据写到磁盘中
- 目前的 shutdown/reboot/halt等命令均已经在关机前进行了sync
1.8.2 用户登录和注销
- 登录时尽量少用root帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用
su - 用户名
命令来切换成系统管理员身份. - 在提示符下输入logout即可注销用户
- 使用细节
- logout 注销指令在图形运行级别无效,在运行级别3下有效.
1.9 用户管理
1.9.1 添加用户
-
useradd 用户名
-
案例
- 添加一个用户Jerry,默认该用户的家目录在/home/tom
- useradd tom
-
细节注意
- 当创建用户成功后,会自动的创建和用户同名的家目录也可以通过useradd -d 指定目录 新的用户名,给新创建的用户指定家目录
1.9.2 设置密码
-
passwd 用户名
-
案例
-
pwd
显示当前所在文件夹的目录
1.9.3 删除用户
userdel 用户名
- 案例
- 删除用户tom,但是要保留家目录
- userdel tom
- 删除用户以及用户主月录
- userdel -r tom
- 删除用户tom,但是要保留家目录
- 一般来说保留家目录
1.9.4 查询用户信息
id 用户名
- 案例:查询root用户id
- id root
- 案例:查询root用户id
1.9.5 切换用户
-
在操作Linux中,如果当前用户的权限不够,可以通过su -指令,切换到高权限用户,比如root
-
su - 用户名
-
细节说明:
- 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
- 当需要返回到原来用户时,使用exit/logout指令
-
输入
who am i
可以查询自己是哪个用户
1.9.6 用户组
类似于角色,系统可以对有共性/权限的多个用户进行统一的管理
groupadd 组名
新增组groupdel 组名
删除组useradd -g 用户组 用户名
增加用户时直接加上组usermod -g 用户组 用户名
修改用户的组groups 用户名
查看用户所在组
1.9.7 用户和组相关文件
-
/ect/passwd 文件
- 用户( user )的配置文件,记录用户的各种信息
- 每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
-
/etc/shadow 文件
- 口令的配置文件
- 每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警 告时间:不活动时间:失效时间:标志
-
/etc/group文件
- 组(group)的配置文件,记录Linux包含的组的信息
- 每行含义:组名:口令:组标识号:组内用户列表
2.0 运行级别
-
运行级别说明:
- 0:关机
- 1 :单用户[找回丢失密码]
- 2 :多用户状态没有网络服务
- 3 :多用户状态有网络服务
- 4 :系统未使用保留给用户
- 5 :图形界面
- 6 :系统重启
- 常用运行级别是3和5 , 也可以指定默认运行级别
-
命令: init [0123456]应用案例:通过init 来切换不同的运行级别,比如动5-3 ,然后关机。
-
init 3
init 5
…
2.0.1 指定运行级别
-
在centos7以前, /etc/inittab文件中.
-
之后,进行了简化,如下:
multi-user.target
: analogous(类似于) to runlevel 3graphical.target
: analogous to runlevel 5
-
systemctl get-default
当前默认的运行级别 -
systemctl set-default "级别".target
设置默认的运行级别
2.1 找回root密码
-
开机之前,在这个界面输入e,进入编辑模式(要快一点,不然就错过了)
-
往下找到:
-
在UTF-8后面输入
init=/bin/sh
输入完成后,直接按快捷键: Ctrl+x 进入单用户模式。 -
接着,在光标闪烁的位置中输入:
mount -o remount,rw /
(注意:各个单词间有空格,逗号左右不要有空格),完成后按键盘的回车键(Enter),再在新的一行输入passwd
。 如图
- -
输入两次密码(密码不会在上面显示,输入完成即可回车,最好是八位及以上,不强求)
-
输入完成后进入新的一行
-
接着,在鼠标闪烁的位置中(最后一行中)输入:
touch /.autorelabel
(注意:touch后面有一个空格),完成后按键盘的回车键 -
继续在光标闪烁的位置中,输入:
exec /sbin/init
(注意: exec后面有一个空格),完成后按键盘的回车键 ,等待 系统自动修改密码(这个过程时间可能有点长,耐心等待),完成后,系统会自动重启,新的密码生效了,这个界面记住多等久一点!!! -
记住多等久一点!!!
-
系统会自动重启,新密码生效
2.2 帮助指令
-
man获得帮助信息
-
基本语法: man[命令或配置文件] (功能描述:获得帮助信息)
-
案例:查看s命令的帮助信息man ls
-
在linux下,隐藏文件是以开头,选项可以组合使用比如ls -al,比如ls -al /root
-
help指令:
- 基本语法: help命令(功能描述:获得shell内置命令的帮助信息)
2.3 文件目录指令
-
pwd指令
- 基本语法: pwd (功能描述:显示当前工作目录的绝对路径)
-
ls指令
- 基本语法: ls [选项] [目录或是文件]
- 常用选项
- -a:显示当前目录所有的文件和目录,包括隐藏的。
- -l:以列表的方式显示信息
-
cd指令
- 基本语法: cd [参数] (功能描述 :切换到指定目录)
- cd ~或者cd :回到自己的家目录,比如你是root,cd ~到/root
- cd …回到当前目录的.上一级目录
- 基本语法: cd [参数] (功能描述 :切换到指定目录)
-
mkdir 指令 创建目录
- 基本语法:mkdir [选项]要创建的目录
- -p:创建多级目录
- 案例:
- mkdir /home/dog
- mkdir -p /home/animals/dog
-
rmdir 指令删除空目录
- 基本语法:rmdir [选项] 要删除的空目录
- rm -rf :强制删除非空目录(不要用rmdir)
-
touch指令创建空文件
- 基本语法:touch 文件名称
-
cp指令 拷贝文件到指定目录
- 基本语法:cp [选项] source dest
- 常用选项:
- -r:递归复制整个文件夹‘
- 案例1:将/home/hello.txt 拷贝到/home/bbb下
- cp hello.txt bbb/
- 案例2:递归复制整个文件夹,举例来比如将/home/bbb整个目录,拷贝到/opt
- cp -r /home/bbb/ /opt/
- \cp 表示默认覆盖相同文件名
-
rm指令 移除文件或目录
- 基本语法:rm [选项] 要删除的文件或目录
- 常用选项:
- -r :递归删除整个文件夹
- -f :强制删除不提示
-
mv指令 移动文件与目录或重命名
- 基本语法:
- mv oldNanteFile newNameFile (功能描述 :重命名)
- mv /temp/movefile /targetFolder (功能描述:移动文件)
- 基本语法:
-
cat指令 查看文件内容
- 基本语法:cat [选项] 要查看的文件
- 常用选项:
- -n:显示行号
- 使用细节:
- cat只能浏览文件,而不能修改文件,为了浏览方便,一-般会带上管道命令 | more
-
more指令
-
more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置.了若干快捷键(交互的指令) ,详见操作说明
-
基本语法:more 要查看的文件
-
操作说明:
-
操作 功能说明 空格 代表向下翻一页; 回车 代表向下翻[一-行J ; q 代表立刻离开more ,不再显示该文件内容。 Ctrl+F 向下滚动一屏 Ctrl+B 返回上一屏 = 输出当前行的行号 :f 输出文件名和当前行的行号
-
-
less指令
-
less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各
种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示
需要加载内容,对于显示大型文件具有较高的效率。-
基本语法:less 要查看的文件
-
操作 功能说明 空白键 向下翻动一页; [pagedown] 向下翻动一页 [pageup] 向上翻动一页; /字串 向下搜寻[字串]的功能; n:向下查找; N:向上查找; ?字串 向上搜寻[字串]的功能; n:向上查找: N:向下查找; q 离开less这个程序;
-
-
echo指令 输出内容到控制台
- 基本语法:echo [选项] [输出内容]
- 案例1:使用echo指令输出环境变量
- echo $HOSTNAME(输出主机名)…
- 案例2:使用echo指令输出hello,world!
- echo “hello word!”
-
head指令 用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容
-
基本语法:head 文件名 (功能描述 :查看文件头10行内容)
-
head -n 5 文件名 (功能描述:查看文件头5行内容,5可以是任意行数)
-
-
tail指令 用于输出文件中尾部的内容,默认情况下tail指令显示文件的前10行内容。
- 基本语法:
- tail 文件名 (功能描述:查看文件尾10行内容)
- tail -n 5文件名 (功能描述:查看文件尾5行内容, 5可以是任意行数)
- tail -f 文件名 (功能描述:实时追踪该文档的所有更新)
- 基本语法:
-
输出重定向 >指令 (覆盖) 和 >>指令 追加
- ls -l xxx > 文件名 (功能描述:列表的内容写入文件a.txt中(覆盖写) )
- ls -al xxx >> 文件名 (功能描述:列表的内容追加到文件aa.txt的末尾)
- cat文件1 >文件2 (功能描述:将文件1的内容覆盖到文件2 )
- echo “内容”>>文件
-
ln指令 软链接也称为符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径
-
基本语法:ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接)
-
案例1:在/home目录下创建一个软连接myroot ,连接到/root目录
- ln -s /root/ /home/myroot
- 使用:cd myroot/
-
案例2:删除软连接myroot
- rm /home/myroot
-
-
history指令 查看已经执行过历史命令,也可以执行历史指令
- 基本语法:
- history 10 (功能描述:查看已经执行过的十条历史命令,不加数字显示所有)
- !5 执行曾经执行的编号为5的指令
- 基本语法:
2.4 时间日期指令
-
date指令 显示当前日期
-
date (功能描述:显示当前时间)
-
date + %Y (功能描述:显示当前年份)
-
date + %m (功能描述:显示当前月份)
-
date + %d (功能描述:显示当前是哪一天)
-
date “+%Y-%m-%d %H:%M:%S” (功能描述 :显示年月日时分秒)
-
date -s 字符串时间(设置系统当前时间)
-
-
cal指令 显示本月日历
- 基本语法:cal [选项] 不加选项显示本月日历
2.5 查找指令
-
find指令 将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。
-
基本语法:find [搜索范围] [选项]
-
选项说明:
-
选项 功能 -name <查询方式> 按照指定的文件名查找模式查找文件 -user <用户名> 查找属于指定用户名所有文件 -size <文件大小> 按照指定的文件大小查找文件。 -
案例1:按文件名:根据名称查找/home目录下的hello. txt文件
- find /home -name hello.txt (或者查找txt文件用 *.txt)
-
案例2 :按拥有者:查找/opt目录下,用户名称为nobody的文件
- find -/opt -user nobody
-
案例3 :查找整个linux系统下大于200M的文件( +n大于 -n小于 n等于,单位有k,M,G)
- find / -size +200M
-
-
locate指令
-
locate指令可以快速定位文件路径。locate指令利用事先建 立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻
- 基本语法:locate 搜索的文件
- 特别说明:
- 由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库。
-
which指令,可以查看某个指令在哪个目录下,比如ls指令在哪个目录
-
grep指令和管道符号 |
- grep过滤查找,管道符,"|” , 表示将前一个命令的处理结果输出传递给后面的命令处理。
-
基本语法:grep [选项] 查找内容源文件
-
常用选项:
-
选项 功能 -n 显示匹配行以及行号 -i 忽略字母大小写
-
-
案例1:请在hello.txt文件中查找"yes"所在行并且显示行号
- cat /home/hello.txt |grep “yes” 或 grep -n “yes” hello.txt
2.6 压缩和解压
-
gzip/gunzip指令 压缩或解压文件
- 基本语法:
- gzip 文件 (功能描述:压缩文件,只能将文件压缩为* .gz文件)
- gunzip文件.gz (功能描述:解压缩文件命令)
- 基本语法:
-
zip/unzip 指令 zip用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的
-
基本语法:
- zip [选项] XXX.zip将要压缩的内容(功能描述:压缩文件和目录的命令)
- unzip [选项] XXX.zip (功能描述:解压缩文件)
-
zip常用选项:-r :递归压缩,即压缩目录
-
unzip的常用选项: -d<目录> 指定解压后文件的存放目录
-
unzip的常用选项:-d<目录> :指定解压后文件的存放目录
-
案例1:将/home’下的所有文件/文件夹进行压缩成myhome.zip
- zip -r myhome.zip /home/ [将home目录及其包含的文件和子文件夹都压缩]
-
案例2:将myhome.zip解压到/opt/tmp目录下
- unzip -d /opt/tmp /home/myhome.zip
-
-
tar指令 是打包指令,最后打包后的文件是.tar.gz的文件。
-
基本语法:tar [选项] XXX.tar.gz 打包的内容(功能描述 :打包目录,压缩后的文件格式.tar.gz)
-
选项说明:
-
选项 功能 -c 产生.tar打包文件 -v 显示详细信息 -f 指定压缩后的文件名 -z 打包同时压缩 -x 解包.tar文件
-
-
案例1:压缩多个文件,将/home/pig.txt和/home/cat.txt压缩成pc.tar.gz
- tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
-
案例2:将/home的文件夹压缩成myhome.tar.gz
- tar -zcvf myhome.tar.gz /home/
-
二、Linux实操篇
1.1 Linux组的基本介绍
1.1.1 基本概念
- linux中的每个用户必须属于一个组,不能独立于组外。linux中每个文件有所有者、所在组、其它组的概念。
1.1.2 文件/目录 所有者
-
一般为文件的创建者谁创建了该文件,就自然的成为该文件的所有者。
-
查看文件所有者,所在组
- 指令:ls -ahl
-
修改文件所有者
- 指令:chown newowner 文件名 改变所有者
- chown newowner:newgroup文件/目录改变所有者和所在组
- -R如果是目录则使其下所有子文件或目录递归生效
-
案例:使用root创建一个文件apple.txt , 然后将其所有者修改成tom
- chown tom apple.txt
1.1.3 组的创建和修改文件所在组
-
基本指令groupadd 组名
-
chgrp newgroup 文件名(修改文件所在组)
- -R 递归将子文件全部修改所在组
1.1.4 改变用户所在组
- usermod -g 新组名 用户名
- usermod -d 目录名 用户名 改变该用户登陆的初始目录。
1.2 权限基本介绍
1.2.1 rwx权限详解
-
ls -l 中显示的内容如下:
-
drwx------. 16 jerry jerry 4096 8月 28 14:19 jerry
-
0-9位说明
- 第0位确定文件类型(d,-,l,c, b)
- l是链接,相当于windows的快捷方式
- d是目录,相当于windows的文件夹
- c是符设备文件,鼠标,键盘
- b是块设备,比如硬盘
- 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。–User (r->读 w->写 x->执行)
- 第4-6位确定所属组(同用户组的)拥有该文件的权限, —Group
- 第7-9位确定其他用户拥有该文件的权限—Other
- 第0位确定文件类型(d,-,l,c, b)
-
rwx 作用到文件
-
[r]代表可读(read):可以读取查看
-
[w]代表可写(write):可以修改但是不代表可以删除该文件删除一个文件的前提条件是对该名件所在的目录有写权限,才能删除该文件.
-
[x]代表可执行(execute):可以被执行
-
-
rwx 作用到目录
- [r]代表可读(read):可以读取, Is查看目录内容
- [w]代表可写(write):可以修改,对目录内创建+删除+重命名目录
- [x]代表可执行(execute):可以进入该目录
-
其它说明
- 16 :文件:硬连接数或目录:子目录数
- jerry:用户
- jerry:组
- 4096:文件大小(字节),如果是文件夹,显示4096字节
- 8月 28 14:19 :最后修改日期
- jerry:文件名
-
修改权限:通过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 文件目录名
-
案例:要求:将/home/abc.txt文件的权限修改成rwxr-xr-x, 使用给数字的方式实现:
- chmod 755 /home/abc.txt
-
1.2.2 最佳实例
police,bandit
jack,jerry:警察xh, xq:土匪
1.创建组
2.创建用户
3.jack创建一个文件 ,自己可以读写,本组人可以读,其它组没人任何权限
4.jack修改该文件,让其它组人可以读,本组人可以读写
5.xh投靠警察,看看是否可以读写.
#创建组
groupdel police
groupadd police
groupadd bandit
useradd -g police jack
useradd -g police jerry
useradd -g bandit xh
useradd -g bandit xq
#2
passwd {username} #设置密码
#3
vim jack.txt
chmod 640 jack.txt
#4
chmod o=r,g+w jack.txt
#5 切换root用户
usermod -g police xh
1.3 crond任务调度
crontab
进行定时任务的设置任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类: 1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等
个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。
-
基本语法 crontab「选项]
-
-e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前用户所有的crontab任务 -
service crontab restart 重启任务调度
-
-
快速入门
- 设置任务调度文件: /etc/crontab
- 设置个人任务调度。执行crontab - e命令。
- 接着输入任务到调度文件
- 如: */1 * * * * * [ls -l /etc/ > /tmp/to.txt
- 意思说每小时的每分钟执行ls - l /etc/ > /tmp/to.txt命令
-
5个占位符*的说明
-
项目 含义 范围 第一个* 一小时当中的几分钟 0-59 第二个* 一天当中的几个小时 0-23 第三个* 一个月中的第几天 1-31 第四个* 一年中的第几月 1-12 第五个* 一周中的星期几 0-7 (0和7都是星期日)
-
-
特殊符号说明;
-
特殊符号 含义 * 代表任何时间。比如第一个*"就代表一小时中每分钟都执行-次的意思。 , 代表不连续的时间。比如0 8,12,16***命令, 就代表在每天的8点0分, 12点0分, 16点0分都执行一次命令 - 代表连续的时间范围。比如“05 * * 1-6命令”, 代表在周一到周六的凌晨5点0分执行命令 */n 代表每隔多久执行一-次。比如"*/10 * 感命令" ,代表每隔10分钟就执行一遍命令
-
-
案例说明:
-
时间 含义 45 22 * * * 在22点45分执行命令 0 17 * * 1 每周1的17点0分执行命令 0 5 1,15 * 每月1号和15号的凌晨5点0分执行命令 40 4 * * 1-5 每周一到周五的凌晨4点40分执行命令 */10 4 * * * 每天的凌晨4点,每隔10分钟执行- -次命令 0 0 1,15 * 1 每月1号和15号,每周1的0点0分都会执行命令。注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。
-
-
应用实例
-
案例1 :每隔1分钟,就将当前的日期信息,追加到/tmp/mydate文件中
- */1 * * * * date >>/tmp/mydate
-
案例2 :每隔1分钟,将当前日期和日历都追加到/home/mycal文件中
- vim my.sh (编辑里面写:date >> /home/mycal和cal >> /home/mycal)
- crontab -e
- */1 * * * * /home/my.sh
-
1.4 at定时任务
at命令是一次性定时计划任务, at的守护进程atd会以后台模式运行,检查作业队列来运行。
默认情况下, atd守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
at命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看
ps -ef | grep atd
可以检测atd是否正在运行
-
at 命令格式
- at [选项] [时间]
Ctrl + D 两次结束at命令的输入
- at [选项] [时间]
-
选项
-
选项 含义 -m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出 -I atq的别名 -d atrm的别名 -v 显示任务将被执行的时间 -c 打印任务的内容到标准输出 -V 显示版本信息 -q(队列) 使用指定的队列 -f(文件) 从指定文件读入任务而不是从标准输入读入 -t(时间参数) 以时间参数的形式提交要运行的任务
-
-
at 时间定义
- 接受在当天的hh:mm (小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:
04:00 - 使用midnight (深夜),noon (中午) , teatime (饮茶时间,一般是下午4点)等比较模糊的词语来指
定时间。 - 采用12小时计时制,即在时间后面加上AM (上午)或PM (下午)来说明是上午还是下午。例如: 12pm
指定命令执行的具体日期,指定格式为month day (月日)或mm/dd/yy (月/日/年)或dd.mm.yy
(日.月年), 指定的日期必须跟在指定时间的后面。例如 : 04:00 2021-03-1 - 使用相对计时法。指定格式为: now + count time-units , now就是当前时间, time- units是时间单位这里能够是minutes (分钟)、hours (小时)、days (天)、weeks (星期)。count是时间的数量,
几天,几小时。例如: now + 5 minutes - 直接使用today (今天)、tomorrow (明天)来指定完成命令的时间。
- 接受在当天的hh:mm (小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:
-
实例:
-
案例1 : 2天后的下午5点执行/bin/ls /home
- at 5pm + 2 days
- /bin/ls /home
-
案例2 : atq命令来查看系统中没有执行的工作任务
- atq
-
案例3 :明天17点钟,输出时间到指定文件内比如/root/date100.log
- at 5pm tomorrow
- date > /root/date100.log
-
1.5 Linux分区
Linux来说无论有几个分区,分给哪一月录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。
Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
lsblk
查看分区 -f
-
硬盘说明:
- 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硬盘的表示方法一样。
-
虚拟机增加硬盘步骤1
- vmware上面添加硬盘
-
虚拟机增加硬盘步骤2
- 分区命令fdisk /dev/sdb
- 开始对/sdb分区
- m:显示命令列表
- p:显示磁盘分区同fdisk -I新增分区
- d:删除分区
- w:写入并退出
- 说明:开始分区后输入n ,新增分区,然后选择p , 分区类型为主分区。两次回车默认剩余全部空间。最
后输入w写入分区并退出,若不保存退出输入q。
- 分区命令fdisk /dev/sdb
-
虚拟机增加硬盘步骤3
- 格式化磁盘
- 分区命令:mkfs -t ext4 /dev/sdb1
- 其中ext4是分区类型
- 格式化磁盘
-
虚拟机增加硬盘步骤4
- 挂载:将一个分区与一个目录联系起来
- mount:设备名称 挂载目录
- 例如: mount /dev/sdb1 /newdisk
- umount 设备名称或者挂载目录
- 例如: umount /dev/sdb1 或者umount /newdisk
- 注意:命令行挂载重启后失效
-
虚拟机增加硬盘步骤5
- 永久挂载:通过修改/etc/fstab实现挂载
- 添加完成后执行mount -a即刻生效
1.6 磁盘情况查询
- 查询系统整体磁盘使用情况
- df -h
- 查询指定目录的磁盘占用情况
- du -h
- 查询指定目录的磁盘占用情况,默认为当前目录
- -s指定目录占用大小汇总
- -h带计量单位
- -a含文件
- –max-depth=1子目录深度
- -c列出明细的同时,增加汇总值
1.7 磁盘情况-工作实用指令
- 统计/opt文件夹下文件的个数
- ls -l /opt/ | grep “^-” | wc -l (wordcount)
- 统计/opt文件夹下目录的个数
- ls -l /opt/ | grep “^d” | wc -l (wordcount)
- 统计/opt文件夹下文件的个数,包括子文件夹里的
- ls -lR /opt/ | grep “^-” | wc -l (wordcount)
- 以树状显示目录结构tree目录,注意,如果没有tree ,则使用yum install tree安装
1.8 Linux网络配置
1.8.1 ping测试主机之间网络连通性
- ping目的机(功能描述:测试当前服务器是否可以连接目的主机)
- ping www.baidu.com
1.8.2 linux网络环境配置(获取ip或者固定ip)
-
第一种方法(自动获取) :
- 说明:登陆后,通过界面的来设置自动获取ip ,特点: linux启动后会自动获取IP,缺点是每次自动获取的
ip地址可能不一样。
- 说明:登陆后,通过界面的来设置自动获取ip ,特点: linux启动后会自动获取IP,缺点是每次自动获取的
-
第二种方法(指定ip)
-
直接修改配置文件来指定IP,并可以连接到外网(程序员推荐)
编辑vi /etc/sysconfig/network-scripts/ifcfg-ens33
要求:将ip地址配置的静态的,比如: ip地址为192.168.111.111 -
ifcfg-ens33文件说明
- DEVICE=eth0 #接口名(设备,网卡)
- HWADDR-O0:0C:2x:6x:Ox:xx #MAC地址
- TYPE=Ethernet #网络类型(通常是Ethemet ,
- UUID-926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机id#系统启动的时候网络接口是否有效( yes/no )
- ONBOOT=yes
- IP的配置方法[nonelstatic[bootp|dhcp] (引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
- BOOTPROTO=static
- #IP地址
- IPADDR=192.168.111.111
- #网关
- GATEWAY=192.168.111.1
- #域名解析器
- DNS1=192.168.111.1
-
步骤
-
vi /etc/sysconfig/network-scripts/ifcfg-ens33
-
BOOTPROTO=“dhcp” -> BOOTPROTO=“static”
-
将上面斜体复制到文件里面去
- -
点击虚拟网络编辑器
-
将VMnet8点击更改设置
-
将VMnet8子网ip第三个改为自己的:
-
点击NAT设置,将网关改为Xshell里面编辑的
-
完成,重启之后就可以了
-
-
1.9 设置主机名和hosts映射
1.9.1 设置主机名
- 为了方便记忆,可以给linux系统设置主机名,也可以根据需要修改主机名
- 指令hostname :查看主机名
- 修改文件在/etc/hostname指定,修改后,重启生效
三、进程
3.1 基本介绍
- 在LINUX中,每个执行的程序都称为一个进程。每一个进程都分配一 个ID号(pid,进程号)
3.2 显示系统执行的进程
-
ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数.
-
选项:
- ps -a: 显示当前终端的所有进程信息
- ps -u: 以用户的格式显示进程信息
- ps -x: 显示后台进程运行的参数
-
含义
-
System V展示风格
-
USER:用户名称
-
PID :进程号
-
%CPU :进程占用CPU的百分比
-
%MEM :进程占用物理内存的直分比
-
VSZ :进程占用的虚拟内存大小(单位: KB )
-
RSS ;进程占用的物理内存大小(单位; KB )
-
TT :终端名称,缩写.
-
STAT :进程状态,其中S-睡眠, s-表示该进程是会话的先导进程, N-表示进程拥有比普通优先级更低
的优先级,R正在运行, D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等 -
STARTED :进程的启动时间
-
TIME : CPU时间,即进程使用CPU的总时间
-
COMMAND :启动进程所用的命令和参数,如果过长会被截断显示
-
3.3 终止进程kil和killall
-
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。
-
语法:
- kill [选项]进程号(功能描述:通过进程号杀死进程)
- killall 进程名称 ( 功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
-
常用选项:
- -9 :表示强迫进程立即停止
3.4 查看进程树pstree
- pstree [选项]可以更加直观的来看进程信息
- 常用选项:
- -p :显示进程的PID
- -u :显示进程的所属用户
3.5 服务管理
3.5.1 介绍
服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld, sshd防火墙等) ,因此我们又称为守护进程,是Linux中非常重要的知识点。[原理图]
-
service指令管理
- service服务名 [start| stopl restart| reload | status]
- 在CentOS7.0后很多服务不再使用service ,而是systemctl
- service指令管理的服务在/etc/init.d查看
-
查看服务名:
- 方式1 :使用setup ->系统服务就可以看到全部。
- 方式2: /etc/init.d看到service指令管理的服务
ls -l /etc/init.d
3.5.2 服务的运行级别
- 运行级别0 :系统停机状态,系统默认运行级别不能设为0 ,否则不能正常启动
- 运行级别1 :单用户工作状态, root权限,用于系统维护,禁止远程登陆
- 运行级别2 :多用户状态(没有NFS) ,不支持网络
- 运行级别3 :完全的多用户状态(有NFS) ,登陆后进入控制台命令行模式
- 运行级别4 :系统未使用,保留
- 运行级别5 : X11控制台,登陆后进入图形GUI模式
- 运行级别6 :系统正常关闭并重启,默认运行级别不能设为6 ,否则不能正常启动
3.5.3 CentOS7后运行级别说明
-
在/etc/initab
-
进行了简化, 如下:
- multi-user.target: analogous to runlevel 3
- graphical.target: analogous to runlevel 5
-
systemctl get-default查看运行级别
-
systemctl set-default设置运行级别
3.5.4 chkconfig指令
-
介绍
- 通过chkconfig命令可以给服务的各个运行级别设置自启动/关闭
- chkconfig指令管理的服务在/etc/init.d查看
- 注意: Centos7.0后,很多服务使用systemctl管理
-
chkconfig基本语法
- 查看服务chkconfig --list [| grep xxx]
- chkconfig 服务名–list
- chkconfig --level 5 服务名 on/off
-
案例演示:对network服务进行各种操作,播network在3运行级别,关闭自启动
- chkconfig --level 5 network off
3.5.5 systemctl 指令
-
基本语法:
- systemctl [start| stop | restart | status]服务名
- systemctl指令管理的服务在/usr/lib/systemd/system查看
- systemctl [start| stop | restart | status]服务名
-
systemctl设置服务的自动启动和关闭
-
systemctl list-unit-files [| grep服务名] (查看服务开机启动状态,grep可以进行过滤)
-
systemctl enable服务名(设置服务开机启动)
-
systemctl disable服务名(关闭服务开机启动)
-
systemctl is-enabled服务名(查询某个服务是否是自启动的)
-
-
案例:查看当前防火墙的状况,关闭防火墙和重启防火墙。=> firewalld.service
- 查看:systemctl status firewalld
- 关闭:systemctl stop firewalld
- 启动:systemctl start firewalld
-
将3306端口加入防火墙
-
细节
- 关闭或者启用防火墙后,立即生效。[telnet 测试某个端口即可
- 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
- 如果希望设置某个服务自启动或关闭永久生效,要使用systemctl [enableldisable] 服务名.
3.5.6 打开指定端口
- firewall指令
- 打开端口: firewall-cmd --permanent --add-port=端口号/协议
- 关闭端口: firewall-cmd --permanent --remove-port =端口号/协议
- 重新载入,才能生效: firewali-cmd --reload
- 查询端是否开放: firewall-cmd --query-port=端口/协议
3.6 动态监控进程
-
top与ps命令很相似。它们都用来显示正在执行的进程。Top与ps最大的不同之处,在于top在执行-段
时间可以更新正在运行的的进程。 -
基本语法:
- top [选项]
-
选项说明
选项 | 说明 |
---|---|
-d描述 | 指定top命令每隔几秒更新。默认是3秒 |
-i | 使top不显示任何闲置或者僵死进程 |
-p | 通过指定监控进程ID来仅仅监控某个进程的状态。 |
-
按下:
- P 以CPU使用率排序,默认就是此项
- M 以内存的使用率排序
- N 以PID排序
- q 退出top
-
案例1.监视特定用户,比如我们监控tom用户
top : 输入此命令,按回车键,查看执行的进程。
u:然后输入"u"回车,再输入用户名,即可, -
案例2 :终止指定的进程。
top :输入此命令,按回车键,查看执行的进程。
k:然后输入"k"回车,再输入要结束的进程ID号
案例3:指定系统状态更新的时间(每隔10秒自动更新)
3.7 监控网络状态
- 查看系统网络情况netstat
- 基本语法:
- netstat [选项]
- 选项说明:
- -an 按一定顺序排列输出
- -p 显示哪个进程在调用
3.8 rpm包的管理
rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager ( RedHat软件包管理工具)的缩写,类似windows的setup.exe , 这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。
-
rpm包的简单查询指令
-
查询已安装的rpm列表 rpm -qa | grep xx
-
举例:查看是否安装了firefox
-
rpm -qa | grep firefox
- firefox-91.11.0-2.el7.centos.x86_64
-
名称:firefox
-
版本号: 91.11.0-2
-
适用操作系统: el7.centos.x86_64表示centos7.x的64位系统
-
如果是i686、i386表示32位系统, noarch表示通用。
-
-
-
rpm包的其他查询指令
- rpm -q 软件包名:查询软件是否安装
- rpm -qi 软件包名:查询软件包信息
- rpm -ql 软件包名:查询软件包中的文件
- rpm -qf 文件全路径名:查询文件所属的软件包
-
卸载rpm包
- 基本语法:rpm -e RPM包的名称//erase擦除
-
安装rpm包
- 基本语法:rpm -ivh RPM包的全路径名称
- 参数说明:
- i=install安装
- v=verbose提示
- h=hash 进度条
3.8 yum
Yum是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动
下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
- 查询yum服务器是否有需要安装的软件
- yum listlgrep xx软件列表
- 安装指定的yum包
- yum install XXX下载安装
- 案例:请使用yum的方式来安装firefox
- rpm -e firefox 先删除原来的
- yum list | grep firefox
- yum install firefox
3.9 安装jdk
- 如果需要在Linux下进行JavaEE的开发,我们需要安装如下软件
- idealU-2020.2.3.tar.gz
- apache-tomcat-8.5.59.tar.gz
- mysql-5.7.26-1.el7.x86_64.rpm-bundl…
- jdk-8u261-linux-x64.tar.gz
- CentOS-7-x86_ _64-DVD-1810.iso
- 安装步骤:
- mkdir /opt/jdk
- 通过xftp 上传到/opt/jdk下
- cd /opt/jdk
- 解压tar -zxvf jdk-8u261-linux-x64.tar.gz
- mkdir /usr/local/java
- mv /opt/jdk/jdk1.8.0 261 /usr/local/java
- 配置环境变量的配置文件vim /etc/profile
- export JAVA_HOME= /usr/local/java/jdk1.8.0_301
- export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
- source /etc/profile [让文件生效,刷新]
- 测试
- java -version
3.10 安装tomcat
-
步骤
- 上传安装文件,并解压缩到/opt/tomcat
- 进入解压目录/bin ,启动tomcat./startup.sh
- 开放端口8080
-
测试是否安装成功:
- 先要把8080加入防火墙打开的列表:firewall-cmd --permanent --add-port=8080/tcp
- firewall-cmd --reload
- windows、Linux下访问http://linuxip(linux的IP地址):8080
3.11 安装Idea
- 解压缩到/opt/idea
- 启动idea bin目录下./idea.sh ,配置jdk
- 编写Hello world程序并测试成功!
四、Shell
4.1 Shell编程
-
脚本格式要求
- 脚本以#!/bin/bash开头
- 脚本需要有可执行权限
-
案例:
-
需求说明:创建一个Shell脚本 ,输出hello world!
-
vim hello.sh
-
#!/bin/bash echo "hello,world~"
-
chmod u+x hello.sh (添加可执行权限)
-
-
或者直接sh hello.sh执行,不需要权限
-
4.2 Shell变量
-
Linux Shell中的变量分为,系统变量和用户自定义变量。
- 系统变量: H O M E 、 HOME、 HOME、PWD、$SHELL、 $USER等等,比如: echo $HOME等等…
- 显示当前shell中所有变量: set
-
shell变量的定义
-
基本语法:
- 定义变量:变量名=值(如)
- 撤销变量:unset
- 声明静态变量,readonly变量,注意不能unset
-
A=`data`等价于$(data)
-
source 配置文件 ( 功能描述:让修改后的配置信息立即生效)
-
-
多行注释:
-
:<<! 注释内容 !
-
4.2.2 位置参数变量
-
当我们执行一个shell脚本时 ,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如: ./myshell.sh 100 200,这个就是一个执行shell的命令行 ,可以在myshell脚本中获取到参数
信息 -
基本语法:
- $n ( 功能描述: n为数字, $0代表命令本身,$1- 9 代表第一到第九个参数 , 十以上的参数 , 十以上的参数需要用大括号包含,如 9代表第一到第九个参数 ,十以上的参数,十以上的 参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10} )
- $* (功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一 个整体)
- @ ( 功能描述 : 这个变量也代表命令行中所有的参数,不过 @ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
- $# (功能描述:这个变量代表命令行中所有参数的个数)
-
案例:编写一个shell脚本position.sh ,在脚本中获取到命令行的各个参数信息。
-
#!/bin/bash echo "$0 $1 $2" echo "$*" echo "$@" echo "$#"
-
4.2.3 预定义变量
-
就是shel设计者事先已经定义好的变量,可以直接在shell脚本中使用
-
基本语法:
- $$ (功能描述:当前进程的进程号(PID))
- $! ( 功能描述:后台运行的最后一个进程的进程号( PID) )
- $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0 ,证明上一个命令正确执行;如果这个变量的值为非0 (具体是哪个数,由命令自己来决定) ,则证明上一个命令执行不正确了。)
-
案例:在一个shell脚本中简单使用一下预定义变量
-
#!/bin/bash echo "当前执行进程的id=$$" #以后台的方式运行一个脚本,并获取它的进程号 /root/shell-codes/myshell.sh & echo "最后一个后台方式运行的进程id=$!" echo "执行的结果是=$?"
-
五、运算符
5.1 运算符
-
“ ( ( 运算式 ) ) " 或“ ((运算式))"或“ ((运算式))"或“[运算式]”或者expr m + n //expression表达式
-
注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用``
-
expr m-n
-
expr \*, /, % 乘,除取余
-
案例:计算(2+3)x4的值
-
#!/bin/bash #第一种方式 RES1=$(((2+3)*4)) echo "res1=$RES1" #第二种方式 RES2=$[(2+3)*4] echo "res2=$RES2" #第三种方式 TEMP=`expr 2 + 3` RES4=`expr $TEMP \* 4` echo "res4=$RES4"
-
5.2 条件判断
-
基本语法:
-
[ condition ] (注意condition前后要有空格)
-
非空返回true ,可使用$?验证( 0为true , > 1为false )
-
-
案例:
-
[jerry] ---- 返回true
-
[] ---- 返回 false
-
[ condition ] && echo OK || echo notok 条件满足 ,执行后面的语句
-
-
常用判断条件
- =字符串比较
- 两个整数的比较
- -lt小于
- -le小于等于 //little equal
- -eq等于
- -gt大于
- -ge大于等于
- -ne不等于
- 按照文件权限进行判断
- -r有读的权限
- -W有写的权限
- -X有执行的权限
- 按照文件类型进行判断
- -f文件存在并且是个常规的文件
- -e文件存在
- -d文件存在并是一个目录
-
案例:判断23 > 22 多分支用elif
-
if[ 23 > 22 ] then echo "大于" fi
-
-
判断文件是否存在:if[ -f 全路径名 ] then xxx fi
5.3 case语句
-
基本语法
-
case $变量名 in "值1") 如果值为1,执行程序1 ;; "值2") 如果值为2,执行程序2 ;; *) 其他,执行此程序 ;; esac
5.4 for语句
-
基本语法1
-
for 变量 in 值1 值2 值3... do 程序/代码 done
-
-
案例1 : 打印命令行输入的参数[这里可以看出 $* 和 $@ 的区别]
-
#!/bin/bash for i in "$*" do echo "num is $i" done echo "===================" for j in "$@" do echo "num is $j" done
-
-
基本语法2
-
for((初始值;循环控制条件;变量变化)) do 程序/代码 done
-
-
案例1 :从1加到100的值输出显示
-
for ((i=1; i<=100; i++)) do SUM=$[$SUM+$i] done echo "总和SUM= $SUM"
-
5.5 while 循环
-
基本语法:
-
注意: while和[有空格,条件判断式和[也有空格 while [ 条件判断式 ] do 程序/代码 done
-
-
案例1 :从命令行输入一个数n,统计从1+…+ n的值是多少?
-
SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo "执行结果:SUM=$SUM"
-
5.6 read读取控制台输入
-
基本语法:read(选项)(参数)
-
选项:
- -p: 指定读取值时的提示符;
- -t: 指定读取值时等待的时间(秒) ,如果没有在指定的时间内输入,就不再等待了。
-
参数:变量:指定读取值的变量名
-
-
案例:
-
#!/bin/bash #案例1:读取控制台输入的一个NUM1值 read -p "请输入一个数NUM1=" NUM1 echo "NUM1=$NUM1" #案例2:读取控制台输入一个NUM2值, 在10秒内输入 read -t 10 -p "请输入一个数NUM2=" NUM2 echo "NUM2=$NUM2"
-
六、函数
6.1 系统函数
6.1.1 basename
-
基本语法:
-
basename [string] [suffix]
-
功能: basename命令会删掉所有的前缀包括最后一个( ‘/’ )字符,然后将字符串显示出来。
-
suffix为后缀,如果suffix被指定了, basename会将pathname或string中的suffix去掉。
-
-
-
案例1 :请返回/home/aaa/test.txt的"test.txt"部分
- basename /home/aaa/test.txt
6.1.2 dirname
-
基本语法:dirname文件绝对路径
- 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
-
案例:请返回/home/aaa/test.txt的/home/aaa
- dirname /home/aaa/test.txt
6.2 自定义函数
-
基本语法:
-
[ function ] funname[()] { Action; [return int;] }
-
-
调用直接写函数名: funname [值]
-
案例:计算输入两个参数的和(动态获取),getSum
-
#!/bin/bash function getSum(){ SUM=$[$n1+$n2] echo "和是=$SUM" } #read -p "请输入一个数n1=" n1 #read -p "请输入一个数n2=" n2 n1=$1 n2=$2 #调用 getSum $n1 $n2
-
6.3 Shell编程综合案例
6.3.1 定时备份数据库
需求分析:
1.每天凌晨2:30备份数据库hspEduDB到/data/backup/db
2.备份开始和备份结束能够给出相应的提示信息
3.备份后的文件要求以备份时间为文件名,并打包成.tar.gz 的形式,比如: 2021-03-12 230201.tar.gz
4.在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
-
vim mysql_db_backup.sh
-
#!/bin/bash #备份目录 BACKUP=/data/backup/db #获取当前时间 DATETIME=$(date +%Y-%m-%d_%H%M%S) echo "$DATETIME" #数据库的地址 HOST=localhost #数据库用户名 DB_USER=root #数据库密码 DB_PWD=ROOT #备份的数据库 DATABASE=hspEduDB #创建备份目录,如果不存在就创建 [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" #备份数据库 mysqldump -u${DB_USER} -p${DB_PWD} --host=${HOST} -q -R --database ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz #将文件处理成tar.gz cd ${BACKUP} tar -zcvf $DATATIME.tar.gz $DATATIME #删除对应的备份目录 rm -rf ${BACKUP}/${DATATIME} #删除十天前的备份文件 find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "备份数据库${DATABASE}成功~"
-
crontab -e
- 30 2 * * * /usr/sbin/mysql/mysql_db_backup.sh
dirname
- 30 2 * * * /usr/sbin/mysql/mysql_db_backup.sh
-
基本语法:dirname文件绝对路径
- 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
-
案例:请返回/home/aaa/test.txt的/home/aaa
- dirname /home/aaa/test.txt
6.2 自定义函数
-
基本语法:
-
[ function ] funname[()] { Action; [return int;] }
-
-
调用直接写函数名: funname [值]
-
案例:计算输入两个参数的和(动态获取),getSum
-
#!/bin/bash function getSum(){ SUM=$[$n1+$n2] echo "和是=$SUM" } #read -p "请输入一个数n1=" n1 #read -p "请输入一个数n2=" n2 n1=$1 n2=$2 #调用 getSum $n1 $n2
-
6.3 Shell编程综合案例
6.3.1 定时备份数据库
需求分析:
1.每天凌晨2:30备份数据库hspEduDB到/data/backup/db
2.备份开始和备份结束能够给出相应的提示信息
3.备份后的文件要求以备份时间为文件名,并打包成.tar.gz 的形式,比如: 2021-03-12 230201.tar.gz
4.在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
-
vim mysql_db_backup.sh
-
#!/bin/bash #备份目录 BACKUP=/data/backup/db #获取当前时间 DATETIME=$(date +%Y-%m-%d_%H%M%S) echo "$DATETIME" #数据库的地址 HOST=localhost #数据库用户名 DB_USER=root #数据库密码 DB_PWD=ROOT #备份的数据库 DATABASE=hspEduDB #创建备份目录,如果不存在就创建 [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" #备份数据库 mysqldump -u${DB_USER} -p${DB_PWD} --host=${HOST} -q -R --database ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz #将文件处理成tar.gz cd ${BACKUP} tar -zcvf $DATATIME.tar.gz $DATATIME #删除对应的备份目录 rm -rf ${BACKUP}/${DATATIME} #删除十天前的备份文件 find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "备份数据库${DATABASE}成功~"
-
crontab -e
- 30 2 * * * /usr/sbin/mysql/mysql_db_backup.sh