Linux笔记
Linux应用领域
Linux下部署项目
Java EE 大数据 Python PHP C/C++ GOLinux运维工程师
Linux嵌入式工程师
个人桌面领域的应用
服务器领域
linux在服务器领域的应用时最强的
linux免费、稳定、高校等特点在这里得到了很好的体现,尤其在一些高端领域尤为广泛嵌入式领域
机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居
Linux概述
如何读?黎纽克斯
linux时一个操作系统,我们使用的过程中都会用到做应用的部署
常见的操作系统 Windows、IOS、Windows、Android、MacOS、Linux
吉祥物?企鹅
VMware虚拟机安装
CentOS7.X安装
网络连接的三种模式
桥接模式
NAT模式
XX模式
虚拟机克隆
如果你已经安装了一台linux操作系统,你还想要更多的,没有必要在重新安装,你只需要克隆就可以了
- 方式一:直接拷贝一份安装好的虚拟机文件
- 方式二:使用vmware的克隆操作
- 注意,克隆时,需要先关闭linux系统
虚拟机快照
如果你在使用虚拟机操作的时候,你想回到原先的某一个状态,也就是说你担心可能有些失误的操作造成系统异常,需要回到原先某个正常运行的状态,wmare也提供了这样的功能,就叫快照管理。
- 安装好系统之后,先做一个快照A
- 进入到系统,创建一个文件夹,在保存一个快照B
- 回到系统刚刚安装好的状态,即 快照A
- 试试看,是否还能再次回到快照B
虚拟机的迁移和删除
虚拟系统安装好了,它的本质就是文件(访问文件夹的),英雌虚拟系统的迁移很方便,你可以把安装好的虚拟系统这个文件夹整体拷贝u哦这剪切到另外位置使用,删除也很简单,使用wmare进行移除,在点击菜单 => 从磁盘删除即刻,或者直接手动删除虚拟系统对应的文件夹即可。
vmtools
vmtools安装后,可以让我们在windows下更好的管理虚拟机
可以设置windows和centos的共享文件夹
安装vmtools的步骤
- 进入centos
- 点击vm菜单的 => instakk wmware tools
- centos会出现一个vm的安装包,xx.tar.gz
- 拷贝到/opt
- 使用解压命名tar,得到一个安装文件 cd /opt 进入到opt目录 tar -zxvg xx.tar.gz
- 使用该vm解压的目录,/opt目录下
- 安装./vmware-install.pl
- 全部使用默认设置即可,就可以安装成功
- 注意:安装vmtools,需要有gcc
Linux目录结构
- Linux的文件i系统采用该层级方式的目录结构,在此结果中最上层时根目录,然后子啊此目录下在创建其他目录
- 深刻理解linux树状目录时非常重要的
- 在linux的世界里,一些皆为文件
目录结构:
- root root用户用到的文件 一般的用户进入不到此文件夹
- boot 启动系统的核心文件,如果把这个文件夹删除,则系统会无法启动
- dev 设备管理器 linux会将硬件映射成一个文件来管理
- home 系统中所有的用户 比如 有一个用户andu 则/home/andu就有此文件夹
- bin 存放常用的命令
- sbin Super Bin 存在的时管理员使用的系统管理程序
- etc 所有的系统管理所需要的配置我呢见和子目录 my.conf
- lib 系统卡机所需要最基本的动态连接共享库
- usr 用户的横夺应用程序和文件都放在这个目录下,类似于Windows下的Program Files目录下
- proc 虚拟目录,它是系统内存的映射, 访问这个目录来获取系统信息
- srv server做些,该目录存在一些服务启动之后需要提取的数据
- sys 这是linux2.6内核的一个很大的变化,该目录下安装了2.6内核中新出现的一个文件系统sysfs
- tmp 存在一些临时文件的
- media linux系统会自动识别一些设备,例如U盘、、光驱、当识别后,linux会把识别的设备挂载到这个目录下
- mnt 系统提供该目录时为了让用户零食挂载别的文件系统的,我们可以将外部的储存挂载在/mnt上,然后进入该目录就可以查看里面的内容了
- opt 这是给主机额外安装软件所摆放的目录,如安装Oracle数据库就可以放在该目录下,默认为空
- usr/local 这是另一个给主机额外安装软件所安装的目录,一般时通过编译源码方式安装的程序
- var 这个目录中存放着不断扩充着的东西,习惯将经常背修改的目录放在这个目录下,包括各种日志文件
- selinux SELinux是一种安全子系统它能控制程序只能访问特定文件,有三种工作模式,可以自行设置
远程登录
公司实际开发中,具体的应用场景时这样的
- linux服务器时开发小组共享的
- 正式上线的项目时运行在公网
- 因此程序员需要远程登录到Linux服务器上面进行项目管理
- 远程登录客户端有XShell,XFtp,MobaXterm,使用方式都差不多
远程文件传输
使用XFtp或者MobaXterm
vi/vim快熟入门
Linux系统会内置vi文本编辑器
Vim具有程序编辑的能力,可以看作时vi的增强版本,可以主动的以字体的颜色辨别语法的正确性,方便程序设计,代码补全。
- 正常模式
以vim打开一个档案可以直接进入一般模式(这里时默认的模式)。在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理档案的内容,也可以使用【复制、粘贴】来处理你的文本数据。 - 插入模式
按下i、I、o、O、a、A、r、R、等任何一个字母之后才会进入编辑模式,一般来说按i比较常用 - 命令行模式
当前在编辑模式下,先按ESC,在输入:(冒号)输入需要执行的命令即可,在这个模式中,可以提供你相关的命令,完成读取、存盘、替换、离开vim、显示行号等的动作,则时在模式中达成的!
使用vim开发一个Hello.java程序:
1 | public class Hello{ |
vim的快捷键
在命令行下输入vim 文件名进入正常模式,
如果需要进入编辑模式就按i,然后就可以写内容了
写完之后需要进入命令模式,先按ESC,在输入:冒号,冒号后面紧接着命令,即可完成整个流程。
(:wq保存并退出 :q退出 :q!强制退出并且不保存)
如无特殊说明,则为 一般模式
- 拷贝当前行yy,拷贝当前行向下的5行,5yy,并粘贴 p
- 删除当前行dd,删除当前行向下的5行,5dd
- 在文件中查找某个单词【命令行模式下 /关键字,回车 查找,输入n就是查找下一个】
- 设置文件的行号,取消文件的行号【命令行下:set nu和:set nonu】
- 编辑/etc/prfile文件,使用快捷键到该文档的最末行[G]和最首行[gg]
- 在一个文件中输入”hello”,然后又撤销这个动作 u
- 编辑/ect/profile文件,并将光标移动到20行 shift + g
开启、重启和用户的登录、注销
shutdown -h now 立刻继续宁关机
shuedown -h 1 1分钟之后关机
shutdown -r now 现在重新启动计算机
halt 关机,作用和上面一样
reboot 现在重新启动计算机
sync 把内存的数据同步到磁盘
注意事项:
1、不管是重启系统还是关系系统,首先要运行sync命令,把内存中的数据写入到磁盘中
2、目前的shutdown、reboot、halt等命令已经在关机前进行了sync。
登录注销:
1、登录时尽量少用root账号登录,因为它是系统管理员,最大的权限,避免操作失误,可以利用普通用户登录,登录后在使用”su - 用户名”来切换成系统管理员身份
2、在提示符下输入logout即可注销用户
使用细节:logout注销指令在图形运行级别无效,在指令运行级别有效
Linux用户管理
Linux是一个多用户多任务的操作系统,任何一个要使用系统i资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统
添加用户
useradd 用户名
1、当创建用户成功后,会自动的创建和用户名的home目录
2、也可以通过useradd -d 指定目录,新的用户名,给新创建的用户指定home目录。
useradd andrew 自动会在/home/andrew创建一个andrew文件夹
指定/修改密码
passwd 用户名
如果不指定用户名就会给当前的用户修改密码!!!
passwd andrew
删除用户
userdel 用户名
1、删除用户andrew,但是要保留/home/andrew目录(默认)
2、删除用户以及主目录 userdel -r andrew
一般情况下,建议保留用户的home目录
查询用户信息
id 用户名
切换用户
在操作Linux中,如果当前用户的权限不够。可以使用su - 指令,切换到高权限用户,比如root
su - 用户名
1、从权限高用户切换到权限低得用户,不需要输入密码,反之需要
2、当需要返回到原来得用户时,使用exit/logout指令
查看当前用户/登录用户
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:系统重启
常用运行级别是3和5,也可以执行默认运行级别
应用实例:init[0 1 2 3 4 5 6] 应用案例:通过init来切换不同得运行级别,比如动5-3,然后关机
指定默认运行级别
在CentOS7以前,/etc/inittab文件中,进行了简化,如下:
multi-user.target: andlogous to runlevel 3
graphical.target: andlogous to runlevel 5
查看默认运行级别
systemctl get-default
设置默认运行级别
systemctl set-default mluti-user.target
找回root密码
如何找回root密码?
有很多方式,最简单的方式就是登录阿里云平台从控制面板修改
帮助指令
man获取帮助信息
man [命令或者配置文件] (功能描述:获取帮助信息)
man ls
linux下隐藏文件时以.开头的
ls -la && ls -al
命令可以组合输入,并且不需要注重顺序
help指令 获得shell内置帮助文档
百度搜索
文件目录
pwd 显示当前工作目录的绝对路径
ls 查看当前目录下的文件信息
ls:查看当前目录下 的文件
ls -l:显示文件的详细信息,权限,大小…..
**cd 切换目录 **
cd ~ :回到自己的home目录
cd ..:回到上一级
cd 文件夹名称:切换到当前目录下的某个文件夹
cd 绝对路径:切换绝对路径下的文件夹
mkdir 创建目录
mkdir [选项] 要创建的目录
选项:
-p:创建多级目录
创建单级目录:mkdir hello
创建多级目录:mkdir -p /www/xiaoyes
rmdir 删除空目录
rmdir [选项] 要删除的目录名称
rmdir删除的时空目录,如果目录下有内容则是无法删除的
如果要删除非空目录,需要使用rm -rf 要删除的目录,谨慎使用!
touch 创建空文件
touch 文件名称
cp 拷贝
cp [选项] 要拷贝的文件 拷贝到哪里
选项:
-r:递归复制整个文件
rm 移除文件或者目录
rm [选项] 要删除的文件或者目录
选项:
-r:递归删除整个文件夹
-f:强制删除不提示
mv 移动文件与目录或者重命名
mv oldFile newFile 就是重命名
mv /temp/moveFile /targetFolder 移动文件
cat 查看文件内容
cat [选项] 要查看的文件
选项:
-n:显示行号
cat Hello.java
cat -n Hello.java
cat -n Hello.java | more 竖杠表示管道命令
more 按页显示文本文件内容
more执行时一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容,more指令中内置了若干快捷键。
more 要查看的文件
操作 | 功能说明 |
---|---|
空白键(space) | 代表向下翻一页 |
Enter | 向下翻一行 |
q | 立即离开more |
Ctrl + F | 向下滚动一屏 |
Ctrl + B | 返回上一层 |
= | 输出当前行号 |
:f | 输出文件名和当前行号 |
less 分屏查看文件内容
less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于大型文件具有较高的效率。
less 要查看的文件
操作 | 功能说明 |
---|---|
空白键 | 向下翻动一页 |
[pagedown] | 向下翻动一页 |
[pageup] | 向上翻动一页 |
/字串 | 向下搜寻[字串]的功能; n : 向下查找;N : 向上查找 |
?字串 | 向上搜寻[字串]的功能; n : 向上查找;N : 向下查找 |
q | 离开less这个程序 |
echo 输入信息到控制台
echo [选项] [输出内容]
使用echo指令输出环境变量 echo $PATH
使用echo指令树池Hello World!
head 显示文件开头部分内容
head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容
head 文件 查看文件头10行内容
head -n 5 文件 查看文件头5行内容,5可以是任意行数
tail 显示文件尾部的内容
tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容
tail 文件 查看文件后10行内容
tail -n 5 文件 查看文件后5行内容,5可以是任意行数
tail -f 文件 实时追踪该文档的所有更新
> 指令 和 >> 指令
一个箭头表示覆盖 两个箭头表示追加
ls -l > 文件 列表的内容写入文件a.txt中(覆盖写)
ls -al >> 文件 列表的内容追加到文件aa.txt的末尾
cat 文件1 > 文件2 将文件1的内容覆盖到文件2
echo “内容” >> 文件
案例:
将/home目录下文件列表写入到/home/info.txt中
ls -l /home > /home/info.txt
如果info.txt不存在则回自动创建
1 | 写入的结果 |
将当前日历信息追加到/home/mycal文件中
cal >> /home/mycal
1 | 写入的结果 |
ln 软链接也称为符号链接
类似于Windows里的快捷方式,主要存放了链接其他文件的路径
ln -s [原文件或目录] [软链接名] 给原文件创建一个软链接
案例:
在/home目录下创建一个软链接myroot,链接到/root目录
1 | ln -s /root /home/myroot |
删除软连接myroot
rm /home/myroot
注意::当我们使用pwd指令查看目录时,仍然可以看到的时软链接所在目录
history 查看历史执行过的命令
history 查看所有
history 10 最近执行的10条
history !5 执行曾经执行过的第5条指令
时间日期类
data 显示当前日期
date 显示当前时间
date +%Y 显示当前年份
date +%m 显示当前月份
date +%d 显示当前是哪一天
date “+%Y-%m-%d %H:%M:%S” 侠士年月日时分秒
cal 查看日历
cal 显示本月日历
cal 2020 显示2020年日历
搜索查找类
find 查找
find指令将从指定目录下向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端
find [搜索范围] [选项]
选项 | 功能 |
---|---|
-name<查询方式> | 按照指定的文件名查找模式查找文件 |
-user<用户名> | 查找属于指定用户名所有文件 |
-size<文件大小> | 按照指定的文件大小查找文件 |
案例:
按文件名:根据名称查找/home目录下的hello.txt文件
find /home -name hello.txt
按拥有者:查找/opt目录下,用户名称为nobody的文件
find /opt -user nobody
查找整个linux系统下大于200M的文件(+n大于 -n大于 n等于,单位有K、M、G)
find / -size +200M
locate 快速定位文件路径
locate指令可以快读定位文件路径。kicate指令利用用实现建立的系统中的所有文件名称以及路径的locate数据库实现快速定位给定的文件,locate指令无须遍历整个文件系统,查询速度较快。为了保证查询结果的准确性,管理员必须定期更新locate时刻
locate 搜索文件
由于locate指令基于数据库进行查询,所以,第一次运行之前,必须使用updatedb指令创建locate数据库。
案例:
请使用locate指令快速定位hello.txt文件所在目录
1 | [root@andu01 CentOS 7 x86_64]# updatedb |
which 查看某个指令在哪个目录下
which 命令
which ls
grep和管道符号|
grep过滤查找,管道符号。”|”,表示将前一个命令的处理结果输出传递给后面的命令处理
基本语法:
grep [选项] 查找内容 源文件
常用选项:
选项 | 功能 |
---|---|
-n | 显示匹配行及行号 |
-i | 忽略字母大小写 |
应用案例:
请在hello.txt文件中,查找”yes”所在行,并且显示行号
cat hello.txt | grep yes
1 | [root@andu01 bbb]# cat hello.txt | grep yes |
不使用管道符号的方式
grep yes hello.txt
显示行号的写法
cat hello.txt | grep -n yes
压缩和解压类
gzip/gunzip
gzip是用于压缩文件,gunzip用来解压文件
gzip 压缩文件,之恩将文件压缩为*.gz文件
gunzip 解压缩文件命令
gzip压缩,将/home下的haha.txt文件进行压缩
gzip /home/haha.txt
解压
gunzip haha.txt.gz
zip/unzip
zip用于压缩文件,unzip用于解压
zip [选项] xxx.zip 压缩
unzip [选项] xxx.zip 解压
zip常用选项:
-r:递归压缩,即压缩目录
unzip常用选项:
-d<目录>:指定解压后文件的存放目录
将/home文件夹下的所有文件压缩成myhome.zip
zip -r myhome.zip /home
将myhome.zip解压到/opt/tmp目录下
unzip myhome.zipi -d /opt/tmp
tar 打包/解压
tar命令是打包指令,最后打包后的文件是.tar.gz的文件
tar [选项] xx.tar.gz 打包的内容
选项 | 功能 |
---|---|
-c | 产生tar打包文件 |
-v | 显示详细信息 |
-f | 之后顶压缩后的文件名 |
-z | 打包同时压缩 |
-x | 解压tar文件 |
压缩多个文件将/home/pig.txt 和 /home/cat.txt 压缩成pc.tar.gz
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
将/home压缩成myhome.tar.gz
tar -zcvf myhome.tar.gz /home
将pc.tar.gz解压到当前目录
tar -zxvf pc.tar.gz
将myhome.tar.gz解压到/opt/tmp2目录下
tar -zxvf home.tar.gz -C /opt/tmp2
Linux组
在linux中的每个用户必须属于一个组,不能独立于组外,在Linux中每个文件有所有者、所在者、其他组的概念
- 1、所有者
- 2、所在组
- 3、其他组
比如有一个hello.txt文件,它是andu用户创建的,andu就是hehllo.txt的所有者,也可以将hello.txt的所有者修改为andew
当然,由于hello.txt的创建者 andu是组 tencent的,则hello.txt的所在组就是tencent,该tencent组下的用户则拥有hello.txt的权限
还有一个ali组,则hello.txt相对于ali的关系就是其他组
每个用户都属于一个组
文件/目录所有者
一般为文件的创建者,谁创建了该文件,就自然称为该文件的所有者
- 查看文件的所有者
指令:ls -ahl - 修改文件的所有者
chown 用户名 文件名
修改apple.txt的文件所有者为andu
chown andu apple.txt
组的创建
groupadd 组名
创建组master
groupadd master
创建用户bjz,放入master组内
useradd -g master bjz
文件/目录所在组
当某个用户创建了一个文件之后,这个文件的所在组就是该用户所在的组
使用bjz创建一个文件,看看这个文件所在的组
创建文件 touch banana.txt
查看文件信息 ll
修改文件所在的组
chgrp 组名 文件名
使用root用户创建文件orange.txt,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到fruit组
创建组 groupadd fruit
创建文件 orange.txt
查看文件组信息 ll
chgrp fruit orange.txt
其他组
除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组
改变用户所在组
在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组
改变用户所在的组:
usermod -g 组名 用户名
usermod -d 目录名 用户名 改变该用户登录的初始目录
Linux权限
权限的基本介绍
ls -l中显示的内容如下:
drwx——. 15 andu andu 4096 9月 15 13:19 abc
0-9位说明:
- 第0位确定文件类型(d, -, l, c ,b)
l是链接,相当于windows的快捷方式
d是目录,相当于windows的文件夹
c是字符设备文件,鼠标,键盘
b是块设备,比如硬盘 - 是一个文件(txt、zip、png…)
- 第1-3位确定所有者(该文件的所有者)拥有该文件的权限,—User
- 第4-6位确定所属组(同用户组的)拥有该文件的权限,—Group
- 第7-9位确定其他用户拥有该文件的权限 —Other
在Linux中权限也可以使用数字表示:r=4,w=2,x=1 因此rwx=4 + 2 + 1 = 7
其他说明:
15 文件:硬连接数或目录:子目数
andu 用户
andu 用户组
4096 文件大小(字节),如果是文件夹,显示4069字节
9月 15 13:19 最后修改日期
abc 文件名
rwx
- rwx作用到文件
1、[r]代表可读(read):可以读取,查看
2、[w]代表可写[write]:可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件
3、[x]代表可执行(execute):可以被执行
- rwx作用到目录
1、[r]代表可读(read):可以读取,ls查看目录内容
2、[w]代表可写(write):可以修改,对目录内创建+删除+重命名目录
3、[x]代表可执行(execute):可以进入该目录
修改权限
通过chmod指令,可以修改文件或者目录的权限
第一种方式:+、-、= 变更权限:
u:所有者 g:所有组 o:其他人:a:所有人(u、g、o的总和)
1、chmod u=rwx,g=rx,o=x 文件/目录名
2、chmod o+w 文件/目录名
3、chmod a-x 文件/目录名
案例:
1、给abc文件的所有者读写执行的权限,给所在组读执行权限,给其他组读执行权限
chmod u=rwx,g=rx,o=rx abc
2、给abc文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
3、给abc文件的所有用户添加读的权限
chmod a+r abc
第二种方式:通过数字变更权限
1 | r=4 w=2 x=1 rwx=4+2+1=7 |
案例:
1、将/home/abc.txt文件的权限系改成rwxr-xr-x,使用给数字的方式实现
1 | chmod 755 /home/abc.txt |
修改文件/目录所有者
chown newowner 文件/目录 改变所有者
chown newowner:newgroup 文件/目录 改变所有者和所在组
-R 如果是目录 则使其下所有子文件或目录递归生效
案例:
1、将/home/abc.txt文件的所有者系改成tom
1 | chown tom /home/abc.txt |
2、将/home/kkk目录下所有的文件和目录的所有者修改成tom
1 | chown -R tom /home/kkk |
修改文件/目录所在组
chgrp newgroup 文件/目录 改变所在组
案例:
将/home/abc.txt文件的所在组修改成shaolin(少林)
1 | groupadd shaolin |
将/home/kkk目录下所有的文件和目录的所在组都修改成shaolin(少林)
1 | chgrp -R shaolin /home/kkk |
权限管理实践
警察和土匪游戏
警察组(police) | 土匪组(bandit) |
---|---|
jack | xh |
jerry | xq |
1、创建组
1 | groupadd police groupbandit |
2、创建用户
1 | useradd -g police jack useradd -g police jerry |
3、jack创建一个文件,自己可以读写
首先jack登录
1 | vim jack.txt |
4、jack修改该文件,让其他组人可以读,本组人可以读写
1 | chmod 644 jack.txt 或者 chmod o=r,g=r jack.txt |
5、xh投靠警察
1 | usermod -g police xh |
6、看看xh和xq是否可以读写该文件,小结论:如果要对目录内的文件进行操作,需要先有对该目录的相应权限
1 | chmod 770 /home/jack |
西游记案例
1、建立两个组:神仙(sx)、妖怪(yg)
1 | groupadd sx |
2、建立四个用户(唐僧、悟空、八戒、沙僧)
1 | useradd ts |
3、设置密码
密码统一设置为用户名
4、把悟空、八戒放入妖怪,唐僧、沙僧放入神仙组
1 | usermod -g yg wk |
5、用悟空创建一个文件(monkey.java 该文件要输出i am monkey)
登录 vim monkey.java
5、给八戒一个可以rw的权限
因为八戒和悟空是同一个组的,所以给当前组添加写的权限就OK
1 | chmod g+w monkey.java |
6、八戒修改monkey.java加入一句话(i am pig)
1 | [bj@andu01 ~]$ cd /home/wk |
发现wk这个目录进不去也是无法修改文件的
所以我们要对该目录进行权限修改
1 | chmod g+r+w+x wk // 将wk当前组的权限修改为读写执行 |
7、把沙僧放入妖怪组
此时沙僧还是无法进入wk目录
1 | [ss@andu01 /]$ cd /home/wk |
然后看一看沙僧是否可以进入wk的文件夹
1 | [ss@andu01 /]$ cd /home/wk |
发现还是进不去,很奇怪!
进不去的原因是因为沙僧,在登录之前是神仙组,然后在沙僧的登录过程中,root用户修改了沙僧的权限,所以,沙僧自己都没有反应过来自己的组被修改了,所以当然是无法进入自己组的用户共享的目录,所以我们要做的就是,重新登录沙僧账户,然后组状态才会重新加载
8、沙僧修改monkey.java
vim /home/wk/monkey.java
细节分析:
假如此时,我们使用root用户对wk目录的权限进行修改
1 | # 组的所有权限都移除 |
然后我们使用悟空同组的八戒登录,并且尝试进入wk目录
1 | [bj@andu01 /]$ cd /home/wk |
发现是可以进去的(因为有了x权限),但是不能使用ls访问该文件夹下的文件
但是此时,我们虽然看不见此目录下有哪些文件,但是我们知道该目录下有个monkey.java文件,我们尝试修改一下这个文件
1 | [bj@andu01 wk]$ vim monkey.java |
结果是可以正常修改文件的!!!
这是因为,我们虽然对wk这个目录只赋予了x的权限,但是wk目录内的文件monkey.java,确是有着本组用户可以读取和修改的权限的
1 | -rw-rw-r--. 1 wk yg 92 9月 17 14:46 monkey.java |
此时,我们使用root用户或者悟空把wk这个目录的读取权限在开放给本组的 用户
1 | [root@andu01 /]# chmod g+r /home/wk |
然后现在八戒是可以正常读取到该目录下的文件的,ls是针对于目录的权限
1 | [bj@andu01 home]$ cd wk |
现在因为monkey.java对本组开放了写的权限,我们尝试一下操作
1 | [bj@andu01 wk]$ rm monkey.java |
我们发现,拥有写权限并不代表可以创建或者删除,而是可以修改
如果我们此时尝试再wk目录下创建ok.txt呢?
1 | # 这里创建文件的权限是针对于wk目录的 |
因为wk文件夹没有对本组开放写的权限,所以导致无法创建文件
我们此时再使用悟空对wk目录进行本组写的权限开放,然后再尝试再wk目录下创建ok.txt文件
1 | [root@andu01 /]# chmod g+w /home/wk |
此时是可以正常创建文件的(在Linux中,无输出内容则表示命令执行成功)
对文件夹rwx的细节分析:
- x表示可以进入到该目录,比如cd
- r表示可以ls,将目录的内容显示
- w表示可以在该目录删除或者创建文件
定时任务调度
crond任务调度
crontab进行 定时任务的设置
概述:
任务调度:是指系统在某个时间主席那个的特定的命令或程序
任务调度分类:
- 系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等
- 个别用户工作:个别用户工作可能希望执行某些程序,比如对MySQL数据库的备份。
基本语法:
crontab [选项]
选项 | 说明 |
---|---|
-e | 编辑crontab定时任务 |
-l | 查询crontab任务 |
-r | 删除当前用户所有的crontab任务 |
快速入门
设置任务调度文件:/etc/crontab
设置个人任务调度:执行crontab -e 命令
接着输入需要执行的任务到调度文件
如:*/1 * * * * ls -l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行ls -l /etc/ > /tmp/to.txt 命令
参数细节说明:
项目 | 含义 | 范围 |
---|---|---|
第一个 * | 一小时当中的第几分钟 | 0-59 |
第二个 * | 一天当中的第几小时 | 0-23 |
第三个 * | 一个月当中的第几天 | 1-31 |
第四个 * | 一年当中的第几月 | 1-12 |
第五个 * | 一周当中的星期几 | 0-7(0-7都代表星期日) |
特殊符号说明
特殊符号 | 含义 |
---|---|
* | 代表任何时间。比如第一个 “*” 就代表一小时中每分钟都能执行一次的意思 |
, | 代表不连续的时间。比如 “0 8,12,16 * * * “命令,代表在每天的8点0分,12点0分,16点0分都执行一次命令 |
- | 代表连续的时间范围。比如” 0 5 * * 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分都会执行命令。注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。 |
任务调度实例
每隔一分钟就将当前的日期信息,追加到/tmp/mydate文件中
1 | */1 * * * * date >> /tmp/date |
每隔1分钟,就将当前日期和日历都追加到/home/mycal文件中
1 | # 编写shell脚本 my.sh |
每天凌晨2:00将MySQL数据库 testdb备份到文件中。
1 | 0 2 * * * mysqldump -uroot -phelloworld testdb > /home/db.bak |
crond相关指令:
- crontab -r:终止任务调度
- crontab -l:列出当前有哪些任务调度
- service crond restart [重启任务调度]
at定时任务
1、at命令是一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列来运行
2、默认其工况下,atd守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
3、at命令时一次性定时计划任务,执行完了一个任务后不在执行此任务了
4、在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看
ps -ef 检查当前所有在运行的进程
ps -ef | grep atd 可以检查atd是否在运行 如果可以看到结果,表示atd正在运行
语法:
at [选项] [时间]
Ctrl + D 结束at命令的输入
命令选项:
选项 | 含义 |
---|---|
-m | 当指定的任务被完成后,将给用户发送又将,即使没有标准输出 |
-I | atq的别名 |
-d | atm的别名 |
-v | 显示任务将被执行的时间 |
-c | 打印任务的内容到标准输出 |
-V | 显示版本信息 |
-q <队列> | 使用指定的队列 |
-f <文件> | 从指定文件读入任务而不是从标准输入读入 |
-t <时间参数> | 以时间参数的形式提交到运行的任务 |
at指定时间的方法
1、接受在当天的hh:mm(小时:分钟)式的时间指定。加入时间已过去,那么就放在第二天执行。例如:04:00
2、使用midnight(深夜),noon(中午),teatime(饮茶时间,一般时下午4点)等比较模糊的词语来指定时间。
3、采用12小时制,即在时间后面加上AM(上午)或PM(下午)来说明时上午还是下午。例如:12pm
4、指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2021-09-17
5、使用相对计时法。指定格式为:now + count time-units,now就是当前时间,time-untis就是时间安慰,这里能够使minutes(分钟)、hour(小时)、day(天)、week(星期)。count时时间的数量,几天,几小时,例如:now + 5 minutes
6、直接使用today(今天)、tomorrow(明天)来指定完成命令的时间
应用实例
1、2天后的下午5点指定/bin/ls /home
1 | at 5pm + 2 days |
2、atq命令来查看系统中没有指定的工作任务
1 | atq |
3、明天17点钟,输出时间到指定文件内 比如/root/date100.log
1 | at 5pm tomorrow |
4、2分钟后,输出时间到指定文件内 比如/root/date200.log
1 | at now + 2 minutes |
5、删除已经设置的任务,atrm 编号
1 | # 比如此时要删除任务的编号为3 |
Linux分区
原理介绍:
1、Linux来说无论有几个分区,分给哪一目录使用,它归根结底只有一个根目录,一个独立且唯一的文件结果,Linux中每隔分区都是用来组成整个文件系统的一部分
2、Linux采用了一种叫 “载入” 的处理方法,它的整个文件系统在红包含了一整套的文件和目录,且将一个分区和一个目录联系起来,这是要载入的一个分区将使它的储存空间在一个目录下获得。
可以使用lsblk命令查看分区以及挂载情况:
1 | [root@andu01 ~]# lsblk |
硬盘说明:
Linux硬盘分IDE硬盘和SCST硬盘,目前基本上是SCSI硬盘
磁盘挂载案例
增加一块硬盘为例来熟悉下磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念。
如何添加一块硬盘:
1、虚拟机添加硬盘
2、分区
3、格式化
4、挂载
5、设置可以自动挂载
略…
网络配置
1 | # Linux下查看网络信息 |
NAT网络原理图
网络环境配置
第一种(自动获取):
Linux启动后会自动获取IP,缺点是每次自动获取的,IP地址可能不一样
第二种(指定IP):
直接修改配置文件来指定IP,并且可以连接到外网(程序员推荐)
编辑:vi/etc/sysconfig/network-scripts/ifcfg-ens33
要求:将ip地址配置为静态的,比如ip地址为:192.168.200.130
ifcfg-ens33文件说明:
1 | DEVICE=eth0 # 接口名(设备,网卡) |
设置主机名和host映射
设置主机名
1、为了方便记忆,可以给Linux系统设置主机名,也可以根据需求修改主机名
2、指令hostname,查看主机名
3、修改文件在/etc/hostname指定
4、修改后重启生效
设置Host映射
如何通过主机名能够找到(比如ping)某个linux系统?
Windows:
在C:\Windows\System32\drivers\etc\hosts 文件指定即可
案例:192.168.200.130 andu
Linux:
在/etc/hosts 文件指定
案例:192.168.200.1 ZhanShen
Linux进程
1、在Linux中,每个执行的程序都称为一个进程。每一个进程都分配一个号(pid,进程号)。
2、每隔进程都可能以两种方式存在,前台与后台,所以前台进程就是用户目前的屏幕上可以进行该操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
3、一般系统的服务都是在后台进程的方式存在,而且都会常驻在系统中。直到关机才结束。
显示系统执行的进程
ps命令是用来查看目前系统中,有哪些正在执行,以及他们执行的情况。可以不加任何参数。
字段 | 说明 |
---|---|
PID | 进程识别号 |
TTY | 终端名称 |
TIME | 进程所消耗CPU时间 |
CMD | 正在执行的命令或进程名 |
STAR | S-睡眠,s-表示进程绘画的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等。 |
USER | 执行进程的用户 |
%CPU | 进程占用CPU的百分比 |
%MEM | 进程占用物理内存的百分比 |
VSZ | 进程占用的虚拟内存大小(单位:KB) |
RSS | 进程占用的物理内存大小(单位:KB) |
COMMAND | 启动进程所用的命令和参数,如果过长会被截断显示 |
ps -a:显示当前终端的所有进程信息
ps -u:以用户的格式显示进程信息
ps -x:显示后台进程运行的参数
组合使用:ps -aux
显示系统执行的进程
以全格式显示当前所有的进程,查看进程的父进程
ps -ef是查看全格式显示当前所有的进程
-e显示所有进程 -f全格式
ps -ef | grep xxx 是BSD风格
UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU用于计算执行优先级的因子。数值越大,表示进程是CPU密集型运算,执行优先级会降低,数值越小,表示进程是I/O密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完成的终端名称
TIME:CPU时间
CMD:启动进程所用的命令和参数
终止进程kill和killall
若是某个进程执行一般需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程,使用kill命令来完成此项任务。
语法:
kill [语法] 进程号(功能描述:通过进程号杀死/终止进程)
killall 进程名称(功能描述:通过进程名杀死进程,也支持通配符,这在系统因负载过大而变得很慢的时候很有用)
常用选项:
-9:表示强迫进程立即停止
最佳实践:
1、踢掉某个非法登录用户
比如我们此时有个非法用户andu,他此时已经通过ssh连接到了服务器,我们现在可以:
ps -aux | grep sshd
然后查看andu对应的进程PID,使用kill PID使andu强制下线
2、终止远程登录服务sshd,在适当的时候再次重启sshd服务
终止:kill sshd进程id 重启:/bin/systemctl start sshd.service
3、终止多个gedit
killall gedit
4、强制杀掉一个终端
ps -aux | grep bash
kill -9 bash进程id
查看进程树
pstree [选项] 可以更加直观的查看进程信息
-p:显示进程PID
-u:显示进程的所属用户
服务管理
服务本质就是进程,但是是在运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如(mysqld、sshd、防火墙)等等。
服务管理指令
1、service 服务名 [start | stop | restart | reload | status ]
2、在CentOS7.0之后 很多服务不在使用service而是systemctl
3、service指令管理的服务在/etc/init.d查看
1 | [root@andu01 ~]# ls -l /etc/init.d/ |
案例:
使用service指令,查看,关闭,启动network [注意:在续集系统演示,因为网络连接会关闭]
1 | # 查看服务状态 |
注意:关闭之后ssh就无法连接此服务器了,直到重启network服务
查看服务名
方式一:使用setup就可以看到全部服务
1 | [ ] saslauthd.service ↑ │ |
方式二:/etc/init.d看到service命令管理的服务
服务的运行级别
Linux系统有7中运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS),不支持网络
运行级别3:完全的多用户 状态(有NFS),无界面,登录后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登录后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设置为6,否则不能正常启动
一般比较经常使用的运行级别为3和5
开启流程说明:
CentOS7后运行级别说明
在/etc/initab尽心简化,如下:
1 | multi-user.target: analogousto runlevel 3 |
chkconfig指令
介绍
1、通过chkconfig命令可以给服务的各个运行级别设置自启动/关闭
2、chkconfig指令管理的服务在/etc/init.d查看
3、注意:CentOS7.0后,很多服务使用systemctl管理
基本语法
1 | # 查看服务 |
对network服务修改运行级别为3并且关闭自启动
1 | chkconfig --level 3 network off |
chkconfig重新设置服务和偶自启动或关闭,需要重启机器reboot生效
systemctl服务管理
systemctl管理指令
1、基本语法:systemctl [start | stop | restart | status ]
服务名
2、systemctl指令管理的服务在/usr/lib/systemd/system
查看
systemctl设置服务的自启动状态
1、systemctl list-unit-files [ | grep 服务名] (查看服务开机启动在黄台,grep可以进行过滤)
2、systemctl enable 服务名(设置服务开机启动)
3、systemctl disable 服务名(关闭服务开机启动)
4、systemctl is-enabled 服务名(查询某个服务是否是自启动的)
应用案例
查看当前防火墙的状况,关闭防火墙和重启防火墙
1 | # 查看防火墙服务的状态 |
细节分析
1、关闭或者启动防火墙后,立即生效。[telnet 测试 某个端口即可]
2、这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置
3、如果希望设置某个服务自启动或关闭永久生效,要使用systemctl [enable | disable] 服务名.
打开或者关闭指定端口
在真正的生产环境,往往需要将防火墙打开,但是问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器见日你刚起端口通讯。这时,需要打开指定的端口。比如80、22、8080 等,这个又怎么做呢?
firewall
打开端口:firewall-cmd --permanent --add-port=端口号/协议
关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
重新载入才能生效:firewall-cmd --reload
查询端口是否开放:firewall-cmd --query-port=端口/协议
应用案例
1、启动防火墙,测试111端口是否能telnet
1 | telnet 192.168.234.130 111 |
2、开放111端口
1 | firewall-cmd --permanent --add-port=111/tcp |
3、再次关闭111端口
1 | firewall-cmd --permanent --remove-port=111/tcp |
动态监控进程
top与ps指令相似,他们都用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新更新正在运行的进程。
基本语法
top [选项]
选项说明
选项 | 功能 |
---|---|
-d 秒数 | 指定top指令每隔几秒更新。默认是3秒 |
-i | 使top不显示任何限制或者僵死进程 |
-p | 通过指定监控进程ID来仅仅监控某个进程的状态 |
交互操作说明
操作 | 功能 |
---|---|
P | 以CPU使用率排序,默认就是此项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
q | 退出top |
1 | # 当前时间 # 系统运行时间 #用户数量 # 负载均衡 |
应用实例
1、监视特定用户
top:输入此指令,按回车键,查看指定进程
u:然后输入”u”回车,在输入用户名,即可
2、终止指定的进程
top:输入此命令,按回车键,查看执行的进程
k:然后输入”k”回车,再输入要结束的进程ID号
在输入信号量为9(强制删除)
3、指定系统状态跟新的时间(跟新10秒自动更新)
top -d 10
监控网络状态
查看系统网路情况netstat
基本语法
netstat [选项]
选项说明
-an 按一定顺序排列输出
-p 选手显示哪个进程在调用
1 | 网络协议 本地地址 远程地址 状态 |
应用案例
请查看服务名为sshd服务的信息
netstat -anp | grep sshd
检测主机连接命令ping
网络检测工具,它主要是用于检测远程主机是否正常,或者是两部主机之间的网线活着网卡故障。
ping 对方ip地址
ping 1.15.235.91
包管理
rpm
rpm用于互联网下载包的打包以及安装工具,它包含在某些Linux分发版中,它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似鱼Windows的Setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。
Linux的分发版本都有采用(suse,redhat,centos等等),可以算是工人的行业标准了。
查询
查询已安装的rpm列表
1 | rpm -qa | grep xx |
查看当前系统是否安装了火狐
1 | rpm -qa | grep firefox |
rpm包基本格式
1 | rpm包名:firefox-60.2.2-1.el7.centos.x86_64 |
查询所安装的所有rpm软件包
rpm -qa | more
查询软件包是否安装
rpm -q firefox
查询软件包信息
rpm -qi firefox
查询软件包中的文件
rpm -ql firfox
文件全路径名 查询文件所属的软件包
rpm -qf /etc/passwd
rpm -qf /root/install.log
卸载
rpm -e RPM包的名称
删除firefox软件包
rpm -e firefox
安装
rmp-ivh RPM包全路径名称
参数
i=install 安装
v=verbose 提示
h=hash 进度条
卸载和安装firefox浏览器
yum
yum是一个Shell前端软件包管理器,依赖于RPM包管理,能够从指定的服务器自动下载RPM并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
查询yum服务器是否有需要安装的软件ea
yum list | grep 软件列表
1 | [root /]# yum list | grep firefox |
安装指定的yum包
yum install xxx
使用yum安装firefox
1 | yum install firefox |
安装JDK
mkdir /opt/jdk
将JDK安装包通过XFTP6上传到/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/kava
配置环境变量的配置文件vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile 让新的环境变量生效
java -version
tomcat安装
下载安装包解压,运行startup.sh文件
并且需要开启8080端口
idea安装
下载安装包并解压
启动bin目录下的./idea.sh
Shell编程
1、Linux运维工程师在进行服务器集群管理时,愮编写Shell程序来进行服务器的管理
2、对于JavaEE和Python程序员来说,可以编写一些Shell脚本进行程序活着是服务器的维护,比如编写一个定时备份数据库的脚本
3、对于大数据程序员来说,需要编写SHell程序来管理集群。
Shell是什么?
Shell是一个命令行解释器,他为用户u提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell脚本的执行方式
脚本格式要求
1、脚本以#!/bin/bash
开头
2、脚本需要有可执行权限
脚本常用的执行方式
方式一(输入脚本的绝对路径或相对路径):
首先要赋予helloworld.sh 脚本的+x权限,在执行脚本
方式二(sh + 脚本)
不用赋予脚本+x权限,直接执行即可
编写一个Shel脚本,输出Hello World
1 | mkdir shCode |
变量
变量介绍
1、Linux Shell中的变量分为,系统变量和用户自定义变量
2、系统变量:$HOME
、$PWD
、$SHELL
、$USER
等等,比如:echo $HOME
等等
3、显示当前shell中所有变量: set
变量的定义
1、定义变量:变量名 = 值
2、撤掉变量:unset 变量
3、声明静态变量:readonly 变量,注意:不能unset
变量的定义规则
1、变量名称可以由字母、数字和下划线组成,但是不能以数字开头
2、等号两侧不能有空格
3、变量名称一般习惯为大写
将命令的返回值赋值给变量
1、A=date
反引号,运行里面的命令,并把结果返回给变量A
2、A=$(date)等价于反引号
快速入门
1、定义变量A
1 | #!/bin/bash |
2、撤销变量A
1 | unset $A |
3、声明静态的变量B = 2,不能unset
1 | readonly name="BJZ" |
4、可以把变量提升为全局环境变量,可供其他shell程序使用
设置环境变量
1、export 变量名=变量值 将shell变量输出为边境变量/全局变量
2、source 配置文件 让修改后的配置信息立即生效
3、echo $变量名 查询环境变量的值
1、在/etc/profile
文件中定义TOMCAT_HOME
环境变量
1 | vim /etc/profile |
2、查看环境变量TOMCAT_HOME
的值
1 | echo $TOMCAT_HOME |
3、在另外一个shell程序中使用TOMCAT_HOME
1 | echo tomcat_home=$TOMCAT_HOME |
注意:在输入TOMCAT_HOME
环境变量前,需要让其生效source /etc/profile
注释
单行注释
1 | # 单行注释 |
多行注释
1 | :<<! 多行注释 |
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如:./myshell.sh 100 200
,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息
基本语法
$n(n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$*(这个变量代表命令行中的所有参数,$*把所有的参数看成一个整体)
$@(这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待)
$#(这个变代替命令行中所有参数的个数)
编写一个shell脚本 position.sh ,在脚本中获取到命令行的各个参数信息
1 | # 创建脚本文件 |
预定义变量
基本介绍
就是shell设计者实现已经定义好的变量,可以直接在shell脚本中使用
基本语法
1 | $$ 当前进程的进程号(PID) |
应用实例
在一个shell脚本中简单使用一些预定义变量
preVar.sh
1 | echo "当前执行的进程ID => $$" |
运算符
基本语法
1、"$((运算式))"
或"$[运算式]"
活着expr m + n
2、注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用``
3、expr m - n
4、expr \*,/,%
乘,除,取余
应用案例
1、计算(2 + 3) * 4
的值
1 | # 第一种方式 |
2、求出命令行的两个参数[整数]的和
1 |
|
条件判断
基本语法
condition
非空返回true,可使用$?验证(0为true >1为false)
应用案例
判断语句
1、=字符串比较
2、两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
3、按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
4、按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录
应用实例
1、”ok”是否等于”ok”
1 |
|
2、23是否大于等于22
1 |
|
3、/root/shcode/aaa.txt
目录中的文件是否存在
1 |
|
流程控制
1 | if [ 条件表达式 ] |
注意:[ 条件表达式 ] 中括号和条件判断式之间必须要有空格
请编写一个shell程序,如果输入的参数大于等于60,则输出”及格了”,如果小于60,则输出”不及格”
1 |
|
case语句
基本语法
case $变量名 in
“值1”)
如果变量的值等于1,则执行程序1
;;
“值2”)
如果变量的值等于2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
当命令行参数是1时,输出”周一”,是2时输出”周二“,其他情况输出”other”
1 |
|
循环控制
基本语法
for 变量 in 值1 值2 值3…
do
程序
done
应用实例
打印命令行输入的参数[这里可以看出$*和$@的区别]
1 |
|
基本语法2
for((初始值;循环控制条件;变量变化++))
do
程序
done
应用案例
从1加到100的值输出显示
1 |
|
while循环
基本语法1
while [ 条件判断式 ]
do
程序
done
应用案例
从命令行输入一个数n,统计1+..+n的值式多少
1 |
|
读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。
参数:
变量:指定读取值的变量名
应用案例
1、读取控制台输入一个num1的值
1 | #!/bin/bash |
2、读取控制台输入一个num2值,在10秒内输入
1 | #!/bin/bash |