这篇Linux&Shell,可复习一下

1. Linux基本介绍

在Linux世界里,一切皆文件。

Linux文件目录结构

  • /bin:是binary的缩写,这个目录存放着经常使用的命令
  • /boot:存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件
  • /dev:类似windows的设备管理器,将所有的硬件用文件的形式存储
  • /etc:存放所有系统管理所需要的配置文件和子目录
  • /home:存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的
  • /lib:存放系统最基本的动态链接共享库,器租用类似于windows中的DLL文件,几乎所有的应用程序都需要用到这些共享库
  • lost+found:一般默认为空,当系统非法关机后,这里会存放一些文件
  • /media:linux系统会自动识别一些硬件设备,例如U盘,光驱等,当识别后,Linux会把识别的设备挂在到这个目录下
  • /mnt:系统提供该目录是为了让用户临时挂在别的文件系统的,可以将外部的存储挂载在/mnt上面,然后进入该目录即可查看内部的内容了。
  • /opt:这是给主机额外安装软件所摆放的目录。默认目录为空
  • /proc:是一个虚拟目录,是系统内存的映射,访问这个目录可以获取系统信息
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录
  • /run:临时文件系统,存储系统启动以来的信息,系统重启时,这个目录下的文件会被删除或者清除
  • /sbin:表示super user,存放的是系统管理员使用的系统管理程序
  • /srv:service的缩写,该目录存放一些服务启动之后需要提取的数据
  • /sys:linux2.6内核中新出现的一个文件系统
  • /tmp:用来存放临时文件
  • /usr:unix shared resources共享资源,用户的很多应用程序和文件都放在这个目录下面,类似于windows中的program files目录
  • /usr/bin:系统用户使用的应用程序
  • /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序
  • /usr/src:内核源代码默认的放置目录
  • /var:这个目录中存放着不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件

建议

  • Linux中的目录是规划好的,文件尽量不要乱放
  • Linux中一切皆文件,所有的设备都是以文件的形式被管理着

2. Linux基本命令学习

2.1 vi和vim

vi和vim是Linux编辑文件的工具,vi是默认就有的,vim需要通过yum install vim的方式来获取。

使用的话:

  • i:表示从当前位置前面插入
  • a:表示从当前位置后面插入
  • u:表示撤销
  • yy:表示复制p表示粘贴
  • dd:表示删除,5dd表示删除此行往下的5行数据
  • :/xxxx,表示查找xxxx
  • :set nu:set nonu表示设置行号和取消行号
  • G表示直接到文档末尾,gg表示直接到文档开头

直接定位某一行::set nu显示行号,输入10,然后G即可使得光标移动到第10行

2.2 Linux开关机以及用户登录注销

2.2.1 关机&重启
  • shutdown

    • shutdown -h now:表示立即关机
    • shutdown -h 1:表示1分钟后关机
    • shutdown -r now:立即重启
  • halt:等价于关机

  • reboot:重启

  • sync:将内存中的数据同步到磁盘

在关机或者重启的时候,都应该先执行sync指令,将内存中的数据写入到磁盘,防止数据丢失

2.2.2 登录&注销

登录的话一般使用root账户登录,输入密码即可,但建议采用普通用户登录,登录后采用su - 用户名切换成系统管理员身份。

注销的话可以直接使用logout即可实现注销。

3. 用户管理

3.2 用户

Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

Linux的用户需要至少属于一个组。

添加&删除用户

# 添加用户useradd [选项] 用户名
useradd xc  
# 指定新用户的家目录
useradd /home/xc xc
# 修改密码
passwd xc
# 切换用户
su xc
# 推出xc用户
exit
# 删除用户
userdel xc
# 删除用户及其用户主目录(家目录/home/x会被删除)
userdel -r xc

查询用户信息

# 查询用户信息,返回的是用户的id号,所在组的id号,组名(如果数据不存在直接返回no such user)
id root
id xc
# id xc的结果
uid=1000(xc) gid=1001(xc) groups=1001(xc)

切换用户

# 在操作过程中,切换到其他用户
su - xc
[root@VM-0-16-centos home]# su - xc	# 切换到xc
[xc@VM-0-16-centos ~]$ cd /root	# 进入/root
-bash: cd: /root: Permission denied	# 无权限
[xc@VM-0-16-centos ~]$ exit	# 退出当前用户
logout

查看用户

我们创建了那么多用户,如何查看我们共有多少个用户呢?

# 查看用户
cat /etc/passwd
# 查看用户名
awk -F':' '{print $1}' /etc/passwd
# 或者
cut -d: -f1 /etc/passwd
# 采用getent命令
getent passwd
# 使用compgen命令
compgen -u

当我们切换用户的时候,从级别高到级别低不需要输入密码,但反过来就需要输入密码了(可以建立两个用户,在用户里面切换可以看到需要密码输入的提示,同级别的也是需要密码切换的)

需要返回原来的用户,使用exit退出当前用户

3.2 用户组

与用户管理类似,用户组是指系统可以对有共性的多个用户进行统一的管理操作。

# 增加组
groupadd student
# 删除组
groupdel student
# 添加用户指定组
useradd -g student xz
# 修改用户属组
usermod -g collage xz

group组相关操作

查看用户组

# 查看用户组
cat /etc/group

cat /etc/passwd

:为分隔符号,依次表示用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell

cat /etc/group

:为分隔符号,依次表示组名:口令:组标识号:组内用户列表

4. 实用指令

4.1 init

init表示发送控制指令给初始化守护进程。

init具体的使用命令:

  0              Power-off the machine	# 关机(init 0)可以快捷关机 
  6              Reboot the machine	# 重启(init 6)可以快捷重启机器
  2, 3, 4, 5     Start runlevelX.target unit	# 运行图形界面
  1, s, S        Enter rescue mode	# 进入救援模式
  q, Q           Reload init daemon configuration	# 重新加载守护进程配置
  u, U           Reexecute init daemon	# 重新执行初始化守护进程

问题:

如何找回root密码,如果不小心忘记了root密码,如何找回密码?

开机引导界面的时候按下回车键,看见界面输入e,此时进入新界面,选中第二行编辑内核在语言的UTF-8之后加入single(注意单词前面有个空格),进入单用户模式,随后进入之后passwd root修改密码即可。(这里可以百度看看,我只是进入了这个模式,但修改密码没实现)

rescue mode救援模式

4.2 help帮助指令

帮助指令第一个就是man,可以通过man获取具体的命令的文档。

帮助指令第二个就是help,可以通过help获取具体的命令的用法。

最好帮助还是百度一下

4.3 基础命令

# pwd显示当前目录的绝对路径
pwd
# ls列出当前文件或者某个目录下的文件
ls
ls /home
# 列出详细的信息
ls -l
# 列出所有文件的详细的信息(包含隐藏文件)
ls -al
# mkdir创建文件夹
mkdir /data
# mkdir -p创建多级目录
mkdir -p /data/son
# rmdir删除空目录(非空会报错:Directory not empty)
rmdir data
# rm -rf删除非空目录
rm -rf data
# 创建新的文件
touch a1.txt
# cp拷贝文件,cp [文件选项] source dest(目标目录)
cp a1.txt ../xw
# 拷贝目录cp -r需要使用-r(recursive)
cp -r data ../xz
# rm删除文件,rm [选项] 要删除的文件或目录
rm a1.txt
# 删除目录文件,-r表递归删除
rm -rf data
# mv移动文件或者文件/目录重命名
mv a1.txt a.txt
mv a.txt ../zx
# cat指令,cat [选项] 要查看的文件
# 查看a.txt文件(-n表带行号)
cat -n a.txt
# cat结合管道,表示统计行数
cat a.txt | wc -l
# more指令:more 要查看的文件,随后按enter可以继续向下浏览,按q可以退出浏览,space翻页
# ctrl+F向下滚动一屏,ctrl+B返回上一屏,=输出当前行的行号,:f输出文件名和行号
more /etc/profile
# less分屏查看文件内容,less 要查看的内容,space翻页,/字串表示向下查找,?字串表示向上查找,q表离开
# 对于查找到的结果n表示向上,N表示向下
less /etc/profile

less指令的主要是用来分屏查看内容,这与more不同,more查看的内容意思是类似于cat的作用,都显示出来了。但less指令再显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示加载显示内容,对于大型文件的显示具有较高的效率

# >与>>指令
# 当前展示的信息会被写入a.txt,这里是覆盖写
ls -l > a.txt
# 信息被追加到文件a.txt中,追加写方式
ls -l >> a.txt
# echo输出内容到控制台,echo [选项] [输出内容]
echo "hello world"
echo $PATH
# head查看文件开头部分,-n指定行数
head -n 5 /etc/profile
# tail查看文件尾部的内容
tail -n 10 /etc/profile
# 实时跟踪文件,一般用于查看实时的日志
tail -f a.log
# ln指令符号链接,类似于windows中的快捷方式,主要存放其他文件的路径
# 软链接ln -s
ln -s /root linkSoftRoot
# 删除软链接
rm -rf linkSoftRoot
# 硬链接ln -P,创建删除同上,唯一的区别,软链接内容会跟随变化,硬链接不会
# history查看历史指令,查看最近常使用的10个指令
history 10
# 查看到历史命令的编号之后可以使用
!1000 # 表示指令历史命令编号的第1000条指令
# date查看当前日期
date
date +'%Y-%m-%d'	# 可以指定具体的格式
# 设置日期date -s 字符串时间
date -s "2020-01-01 10:10:10"
# 查看日历,-1表示只展示当前月,-3表示展示前一个月当前月后一个月
cal
# find查找,查找data目录下名称为a.txt的文件,同时可以根据用户查询-user,根据文件大小查询-size
find /data -name a.txt
# -10M表示小于10M,+10M表示大于,10M表示正好
find /data -size -10M
# locate快速定位文件路径,locate 搜索文件
locate cookie.txt
# grep指令与管道,grep过滤查找,“|”管道符号,表示将前一个命令的处理结果输出传递给后面的命令处理
# grep [选项] 查找内容 查找的文件,-n显示匹配和行号,-i表示忽略大小写
grep -n Edit cookie.txt
# gzip和gunzip,gzip用于压缩文件,gunzip用于文件解压
gzip 文件	# 文件只能被压缩为gzip格式
gunzip 文件
# zip和unzip文件压缩和解压缩
# zip -r 文件:递归压缩,unzip文件:递归解压缩
zip -r shell.zip ./shell	# 将shell目录压缩为shell.zip
zip -d ./ shell.zip	# 将shell.zip解压缩到当前目录

由于locate是基于数据库查询,所以在查询之前可以使用updatedb先更新数据库。locate指令实现建立的系统中包含所有文件名称和路径,locate数据库实现快速定位给定的文件,Locate指令无需遍历整个文件系统,查询速度较快,为了保证查询结果的准确度,管理员需要定期更新locate文件。

# tar打包命令,打包后的文件为.tar.gz文件,tar [选项] xxx.tar.gz
tar -zcvf shell.tar.gz ./shell/	# 将shell打包为shell.tar.gz
tar -zxvf shell.tar.gz	# 解压缩
tar -zxvf shell.tar.gz -C ./	# -C表示指定目录,解压到当前目录

tar

  • -c:产生.tar.gz文件
  • -v:显示详细信息
  • -f:指定压缩后的文件名
  • -z:打包同时压缩
  • -x:解压缩.tar.gz文件

5. 组管理和权限管理

5.1 组管理

在Linux中每个用户必须属于一个组,不能独立于组外,在Linux中每个文件有所有者、所有组、其他组的概念。

文件所有者一般为文件的创建者。

# 查看文件所有者,-a表示所有用户,-l表示按照长列表(自上到下)格式来,-h表示按照人类的看法来文件会有k,g做单位
ls -alh

查看文件具体信息

# 修改文件所有者chown 用户名 文件名
chown xc xc.txt	# 修改xc.txt文件所有者为xc
# 修改所属组
chgrp collage xc.txt # 修改xc.txt属组为collage

除了文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组

5.2 权限管理

图中,文件前面的drwxr-xr-x第一位表示文件/目录,如果是-表示文件,d表示目录,c表示字符设备(鼠标/键盘)。

接下来的rwx表示文件所有者的权限,r-x表示文件所在组的用户的权限,r-x表示其他组的用户的权限。

r表示读权限,w表示写权限,x表示执行的权限。

文件详情

# 修改权限
chmod u=rwx,g=rx,o=x /shell	# 表示修改/shell目录下的用户权限为rwx,组的权限为rx,其他组权限为x
# 或者
chmod u+x g-x o+rw /shell
# 或者r=100,w=010,x=001
chmod 116 /shell
# 修改文件所有者
chown xz xz.txt
# 修改文件所有者及组
chown xz:student xz.txt # 修改xz.txt的文件所有者和组
# 如果是修改整个目录中所有的文件的所有者及组使用-R表示递归设置

6. 任务调度

任务调度:是指系统在某个时间执行的特定的命令或者程序

任务调度分类:

  • 系统工作,有些重要的工作必须周而复始的执行,如病毒扫描等
  • 个别用户工作:个别用户可能希望执行某些程序,比如对MySQL数据库的备份操作。

crontab [选项],常用的选项:

  • -e:编辑crontab定时任务
  • -l:查询crontab定时任务
  • -r:删除当前用户所有的crontab任务

crontab -e,编辑*/1 * * * * ls -l /data/shell/ >> /data/shell/cron.txt则设置了一个定时任务每一分钟执行一次,内容追加到cron.txt文件中。

* * * * *

  • 第一个:表示一小时当中的第几分钟*/1表示任意的一分钟
  • 第二个:表示一天当中的第几个小时*/1表示任意的一个小时
  • 第三个:表示一个月当中的第几天*/1表示月内的任意一天
  • 第四个:表示一年当中的第几个月*/1表示年内任意的一个月
  • 第五个:表示一周当中的星期几*/1表示一周内的星期1

,则表示不连续的时间0 8,12,16 * * *表示每天的8点0分,12点0分,16点0分触发

-表示连续的时间段,0 5 * * 1-6表示在周一到周六的凌晨5点0分执行

# 终止任务调度
crontab -r
# 列出当前任务调度列表
crontab -l
# 重启任务调度
service crond restart

7. Linux磁盘操作

7.1 分区&挂载

Linux无论有几个分区,分给哪一个目录使用,归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。

Linux采用了一种叫做载入的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来,这是要载入的一个分区将使它的存储空间在一个目录下获得。

分区挂载暂时搁置

7.1 磁盘情况查询

# 查看系统整体磁盘使用情况
df -lh

查询指定目录的磁盘占用情况

du -h /目录

  • -s:指定目录占用大小汇总
  • -h:带计量单位
  • -a:含文件
  • –max-depth=1:子目录深度1,可以设置为其他值,表示不同的深度
  • -c:列出明细的同时,增加汇总值
# 查询opt目录深度为2的目录磁盘占用情况,-a包含文件,-c列出明细+汇总值,-h计量单位k,g
du -ach /opt --max-depth=2
# 查看某个目录文件夹下面文件的个数
ls -l /data | grep "^-" | wc -l
# 目录下文件夹个数
ls -l /data | grep "^d" | wc -l
# 包含子文件夹的文件
ls -lR /data | grep "^-" | wc -l
# tree如果没有则yum install tree -y
# 以树状显示目录结构
tree

8. 网络配置

8.1 网络服务

# 重启网络服务
service network restart
# 网络配置文件
TYPE="Ethernet"	# 网络类型
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"	
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="5dbdfb48-d5f3-41d3-b77b-1fcd2d6f2d4d"
DEVICE="ens33"
ONBOOT="yes"	# 系统启动的时候网络接口是否有效
IPADDR="192.168.233.129"	# ip地址
PREFIX="24"
GATEWAY="192.168.233.2"		# 网关
DNS1="192.168.233.2"	# 域名服务解析
IPV6_PRIVACY="no"

9. 进程管理

9.1 查看进程

Linux中每个执行程序(代码)都称为一个进程,每一个进程都分给一个ID号。

每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。每个进程都可以以两种形式存在,前台与后台,前台进程就是用户在目前的窗口可以进行操作的,后台的进程则是实际在操作,但窗口看不到的进程。

一般系统的服务都是以后台进程的方式存在而且都会常驻在系统中,直到关机才结束。

显示系统执行的进程

  • PID:进程识别号
  • TTY:终端机号
  • TIME:此进程所消耗的CPU时间
  • CMD:正在执行的命令或者进程名
# 显示当前终端所有的进程信息
pa -a
# 以用户的格式显示进程信息
ps -u
# 显示后台进程运行的参数
ps -x

系统运行进程

# 查询某个服务的进程
ps -aux | grep mysql # 查询mysql进程
# ps -ef以全格式查看进程,其中PPID表示父进程ID号
ps -ef | [more|less]
# 查看某个进程
ps -ef | grep mysql

终止进程kill

如果进程执行过程中需要停止的时候,或者已经消耗了太多的系统资源需要停止时,此时可以使用kill命令来完成任务。

# kill [选项] 进程号:通过进程号杀死进程
kill 1000 # 杀死进程号为1000的进程
# kill -9表示强迫进程立即停止
kill -9 1000
# killall 进程名称:通过进程名称杀死进程,支持通配符,在系统因为负载过大而变得很慢的时候很有效。

进程树pstree

pstree [选项]可以更加直观的查看进程信息。

  • -p:显示进程的PID
  • -u:显示进程所属的用户

9.2 进程服务

服务Service的本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,因此也被称为守护进程(daemon process)。systemctl可以控制相应的进程。

systemctl 服务名 [start|stop|restart|reload|status]

# 查看当前防火墙的状况
systemctl status firewalld
# 开启防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 禁止开启启用防火墙
systemctl disable firewalld
# 列出当前的可用端口
firewall-cmd --list-ports
# 查询某个端口
firewall-cmd --query-port=6379/tcp
# 打开某个端口
firewall-cmd --add-port=6379/tcp --permanent
# 关闭某个端口
firewall-cmd --remove-port=6379/tcp --permanent
# 重新载入添加的端口,如果不重载开放的端口是看不见的
firewall-cmd --reload

个人的虚拟机还是建议端口全开吧,即关闭防火墙服务

9.3 开机流程

开机=>BIOS=>/boot=>init进程1=>运行级别=>运行级别对应的服务

chkconfig可以给每个服务的各个运行级别设置启动/关闭

# 查看某个服务的运行级别情况
chkconfig --list | grep xxx
# 或者
chkconfig 服务名 --list
# 修改某个服务的运行级别
chkconfig --level 0 network off	# 关闭network运行等级为0的服务

9.4 动态监控进程

top和ps命令很相似,都是用来显示正在执行的进程,但top命令不同,top命令显示的是动态的运行的进程,即进程的数据会更新以显示。

top [选项]

  • -d:指定top命令每隔几秒更新,默认是3秒在top命令的交互模式当中可以执行的命令
  • -i:使top不显示任何闲置或者僵尸进程
  • -p:通过指定监控进程ID来获取某一个进程的状态
# 查看所有进程动态信息
top
# 查看进程号为1000的进程的动态信息
top -p 1000
# 指定更新时间为2秒且不显示闲置或者僵尸进程
top -d 2 -i

交互命令

  • P:以CPU使用率排序,默认项
  • M:以内存使用率进行排序
  • N:以PID进行排序
  • q:退出top

top命令详解

上面部分参数含义:

  • top行:当前时间,up系统运行时间,users登录用户数,load averge:系统负载,分别表示任务队列的平均长度,三个数值分别为1分钟、5分钟、15分钟到现在的平均值。
  • Tasks行:total:总的进程数,running:正在运行的进程数,sleeping:睡眠的进程数,stopped:停止的进程数,zombie:僵尸进程数
  • CPU行:us:用户空间占用CPU百分比,sy:内核空间占用CPU百分比,ni:用户进程空间改变过优先级的进程占用CPU百分比,id:空间CPU百分比,wa:等待输入输出的CPU时间百分比,hi:硬中断占用CPU的百分比,si:软中断占用的CPU的百分比,st:
  • KiB Mem行:total:物理内存总量,free:空间内存总量,used:使用的物理内存总量,buff/cache:用作内核缓存的内存量
  • KiB Swap行:total:交换区总量,used:使用的交换区总量,free:空闲交换区总量,avail Mem:可用于进程下一次分配的物理内存量

下面部分参数含义:

  • PID:进程号
  • USER:进程所有者用户名
  • PR:优先级
  • NI:nice值,负值表示高优先级,正值表示低优先级
  • VIRT:进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
  • RES:进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA
  • SHR:共享内存大小单位kb
  • S:进程状态,S睡眠,D不可中断的睡眠状态,Z僵尸进程,R运行
  • %CPU:上次更新到现在CPU时间占用百分比
  • %MEM:进程使用的物理内存百分比
  • TIME+:进程使用的CPU时间总计,单位1/100秒
  • COMMAND:命令名/命令行
# top命令之后按M可以让进程按照占用内存率的排序
# 按P则按照CPU使用率进行排序,是默认的设置

top中终止某个进程

启动top以后,按下k此时按照提示输入进程号即可。

9.5 查看网络情况netstat

netstat [选项]

  • -a:展示所有的sockets连接,默认是展示连接状态的socket
  • -n:直接使用ip地址,不通过域名服务器
  • -p:展示socket的进程的进程号PID或者程序名称
  • -l:显示监控中的服务器的socket(Listening)
# 查看系统所有的网络服务
netstat -anp | more
# 查看某个网络服务的网络状态
netstat -anp | grep docker

netstat信息

  • Proto:协议
  • Recv-Q:接收队列
  • Send-Q:发送队列
  • Local Address:本地连接地址
  • Foreign Address:外部连接地址
  • State:状态
  • PID/Program name:进程号/程序名称

State状态

  • LISTEN:侦听来自远方的TCP端口的连接请求
  • SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
  • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击
  • ESTABLISHED:代表一个打开的连接
  • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  • FIN-WAIT-2:从远程TCP等待连接中断请求
  • CLOSE-WAIT:等待从本地用户发来的连接中断请求
  • CLOSING:等待远程TCP对连接中断的确认
  • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
  • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
  • CLOSED:没有任何连接状态

10. rpm和yum

10.1 rpm包的管理

rpm是一种互联网下载包的打包及安装工具,它包含在某些Linux分发版本中,他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似于windows中的setup.exe。

使用

# 查询已经安装的rpm列表
rpm -qa | grep rabbitmq
# 查询软件包安装的位置
rpm -ql rabbitmq-server-3.8.9-1.el7.noarch
# 查询软件包信息
rpm -qi rabbitmq-server-3.8.9-1.el7.noarch
# 卸载软件包
rmp -e rabbitmq-server-3.8.9-1.el7.noarch
# 安装软件包
rpm -ivh xxxx.rpm
  • -a:查询所有套件

  • -q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户

  • -l:显示套件的文件列表

  • -i:显示套件的相关信息

  • -v:显示执行执行过程

  • -h:套件安装时列出标记(显示进度条)

  • -f:显示拥有指定文件的套件

  • -e:删除指定的套件

10.2 yum

yum是一个Shell端软件包管理器,基于rpm包管理,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,使用yum的前提是可以联网

# 查询yum服务器是否有需要安装的软件
yum list | grep rabbitmq
# 安装软件
yum install net-tools -y
# 查找软件包
yum search net-tools
# 删除软件包
yum remove net-tools -y
# 清除缓存目录下的软件包
yum clean packages

11. Shell脚本

Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁,Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

一个脚本的诞生

# 首先建立一个脚本
touch first.sh
# 赋予其执行的权限
chmod +x first.sh

接着编写内容

#!/bash/bash
echo "hello world!"
# 最后执行,屏幕会打印出hello world
sh ./first.sh

脚本的诞生

11.1 Shell变量

Shell变量与其他语言的变量命名规则基本一致。只是在使用变量的时候有些许不同。

# 定义变量
name = "aaroncao"
# 使用变量
echo $name
# 或者(建议采用这种方式会比较直观且不容易出错)
echo ${name}
# 只读变量,将name设置为只读变量(表示不可修改,否则会发生错误This variable is read only)
readonly name
# 删除变量
unset name

shell三种变量类型

  • 局部变量:局部变量在脚本或者命令中定义,仅能在当前shell中生效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量
  • shell变量:shell变量是shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

11.2 Shell字符串

Shell字符串主要有两种形式:

  • 单引号
    • 单引号里面的任何字符都会原样输出,单引号字符串中的变量是无效的(即单引号不能够使用变量)
    • 单引号子串中不能够出现单独的单引号,转义的单引号也不允许,但是可以作为字符串拼接使用。
  • 双引号
    • 双引中可以有变量
    • 双引号中可以出现转义字符

相关的操作

# 获取字符串长度
str = "abcd"
echo ${#str}
# 提取子字符串,类似python中的切片操作
echo ${str:1:4}
# 查找子字符串,查找b的位置
echo `expr index "${str}" b`
#!/bin/bash
str="abcd"
echo "长度"
echo ${#str}
echo "截取字符"
echo ${str:1:4}
echo "查找b的下标"
echo `expr index "${str}" b`

11.3 Shell数组

Shell中支持一维数组,不支持多维数组,没有限定数组的大小。下标从0开始编号,获取数组中的元素主要依赖下标,下标可以是整数或者算数表达式。

# 定义数组
arr=(v1,v2,...,vn)
# 获取数组的某个值
echo ${arr[0]}
# 获取数组中所有的元素
echo ${arr[@]}
# 获取数组的长度
echo ${#arr[@]}
# 或者
echo ${#arr[*]}
# 获取数组中单个元素长度
echo ${#arr[index]}

11.4 Shell注释

#开始的表示单行注释,会被解释器忽略。

多行注释

# 多行注释
:<<EOF
注释内容
EOF
# 或者使用其他符号
:<<!
注释内容
!
# 或者
:<<'
注释内容
'

11.5 Shell传参

Shell中传递参数,使用$0,$1...,$n的方式获取参数。n表示数字。一般第0个参数为文件名,第1个参数为脚本传递的实际第一个参数,后面参数依次类推。

# 获取传递到脚本的参数个数
echo "参数个数$#"
# 获取所有的参数
echo "参数$*"
# 获取脚本当前执行的进程号
echo "进程号$$"
# 获取后台运行的最后一个进程号
echo "最后一个进程号$!"
# 获取脚本运行结果,0表示没有错误,非0表示有错误产生
echo "运行结果:$?"

11.6 Shell运算符

Shell支持的运算符

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生的bash不支持简单的数学运算,可以通过其他命令来实现,例如awk和expr,expr最常用。

# 完成两数相加
val = `expr 2+2`
echo "求和:$val"
# 逻辑判断,判断数字大小
if [ $a > $b] then
   echo "a > b"
else
   echo "a <= b"
fi

关系运算符

  • -eq:判断是否相等
  • -ne:判断是否不相等
  • -gt:判断左边的是否大于右边的
  • -lt:判断左边的是否小于右边的
  • -ge:判断左边的是否大于等于右边的
  • -le:判断左边的是否小于等于右边的

注意逻辑判断需要使用[ $a > $b]中括号

布尔运算符

  • !:非运算
  • -o:或运算,or
  • -a:与运算,and

逻辑运算符

  • ||:逻辑的或OR
  • &&:逻辑的与AND

字符串运算符(重要)

  • =:判断两个字符是否相等
  • !=:判断两个字符串是否不等
  • -z:判断字符串长度是否为0,zero
  • -n:判断字符串长度是否不为0not zero
  • $:判断字符串是否为空,不为空返回true
# 判断字符是否相等
a="abc"
b="def"
if [ $a = $b ] 
then
   echo "$a = $b"
else
   echo "$a != $b"
fi
# 判断字符串不为空
if [ -n "${a}" ]
then
   echo "不为空"
else
   echo "为空"
fi

文件测试运算符

文件测试运算符用于检测Unix文件的各种属性。

  • -b file:检测文件是否是块设备文件

  • -c file:检测文件是否是字符设备文件

  • -d file:检测文件是否是目录

  • -f file:检测文件是否是普通文件(非目录,非设备文件)

  • -g file:检测文件是否设置了SGID

  • -k file:检测文件是否设置了粘着位

  • -p file:检测文件是否是有名管道

  • -u file:检测文件是否设置了SUID

  • -r file:检测文件是否可读

  • -w file:检测文件是否可写

  • -x file:检测文件是否可执行

  • -s file:检测文件是否为空(文件大小是否大于0)

  • -e file:检测文件(包括目录)是否存在

# 判断文件是否是普通文件
file="/data/shell/04.sh"
if [ -f $file ]
then
   echo "我是普通文件"
else
   echo "我不是普通文件"
fi
# 判断是否可读可写可执行
if [[ -r $file && -w $file ]]
then
   echo "我可读可写"
else
   echo "不可读不可写"
fi

注意,if[]中判断结果只能够有一个,如果出现了多个使用[]囊括起来即可

11.7 Shell echo

echo主要用与字符串的输出。

-e开启字符串内的转义字符含义,如果不开启\n会被当做文本输出,而不是换行效果展示。

11.8 Shell printf

printf模仿C程序库中的printf()方法。

语法:

printf format-string [arguments...]

format-string

  • %s:输出字符串
  • %d:输出整数
  • %c:输出一个字符
  • %f:输出实数,以小数形式展示
# 输出字符串,输出小数,输出整数
str="hello,world!"
printf "%s\n" ${str}
number=100
printf "%0.2f\n" ${number} # 表示可以保留两位小数
int=10
printf "%d\n" ${int}

11.9 Shell test

Shell中的test命令用于检查某个条件是否成立,可以进行数值、字符和文件三个方面的测试。

实际作用if类似,只是不需要[]中括号了

具体使用的判断符如关系运算符所描述

# 判断长度
str="abc"
if test ${#str} -ge 3
then
   echo "长度≥3"
else
   echo "长度<3"
fi

作用与if几乎相同,只是使用其作为[]的作用

11.10 Shell流程控制

if…else流程

if condition
then
   dosomething
else
   dosomething
if

if...elif...else...fi

if condition
then
   dosomething
elif condition1
then
   dosomething
else
   dosomething
fi

for循环

for var in item1,item2,...itemn
do
	dosomething
done
# 对数组遍历输出
arr=(1 2 3 4 5)
for a in ${arr[@]}
do
  echo $a
done

while循环

while condition
do
	dosomething
done
# while遍历数组
i=0
while test $i -lt $len
do
  echo ${arr[$i]}
  let "i++"
done

unitl循环

until condition
do 
	dosomething
done
# 遍历
i=0
until test $i -ge $len
do
  echo ${arr[$i]}
  let "i++"
done

case选择

case val in
mode1)
    dosomething
    ;;
mode2)
    dosomething
    ;;
esac
# 模式匹配,*匹配未匹配中的
case $1 in
"a")
  echo "this is mode a"
  ;;
"b")
  echo "this is mode b"
  ;;
*)
  echo "this is default mode"
  ;;
esac

break跳出循环

可以使用break跳出整个循环

continue跳过当前循环

可以使用continue跳过当前循环

11.11 Shell函数

Shell中可以自主定义函数,然后再Shell脚本中调用

[function] funcName[()]
{
  doSomething;
  [return data;]
}
# 定义求和函数对传入的数据进行求和
addNumber(){
   return `expr $1 + $2`
}
addNumber $1 $2
echo "$1+$2=$?"
# 菜鸟案例,read可以进行文件读写
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

函数可以传递参数,具体获取参数的方法按照之前Shell参数获取

11.12 Shell输入/输出重定向

  • command > file:将输出重定向到file中
  • command < file:将输入重定向到file中
  • n > file:将文件描述符为n的文件重定向到file
  • n >> file:将文件描述符为n的文件追加到file
  • n >& m:将输出文件m和n合并
  • n <& m:将输入文件m和n合并
  • << tag:将开始标记tag和结束标记tag之间的内容作为输入

重定向会覆盖原来的内容,而追加不会

# 输出内容到file中
echo "hello,world" > file
# 输入重定向
cat < file
# 输入重定向的内容重定向输出到file1
cat < file > file1
# 内容追加
echo "add something" >> file

输入/输出/错误文件

  • 标准输入文件stdin:文件描述符为0,Unix程序默认从stdin读取数据
  • 标准输出文件stdout:文件描述符为1,Unix程序默认从stdout输出数据
  • 标准错误文件stderr:文件描述符为2,Unix程序会向stderr流中写入错误信息
# 获取user中的内容重定向输出到file文件中,2>&1是将错误信息和标准输出合并后重定向到file中
cat user > file 2>&1
# 展示区间内容输入的信息
cat << in
哈哈
呵呵
in
# 输出
哈哈
呵呵

11.13 Shell文件包含

Shell可以引入外部的脚本。从而实现在当前脚本执行外部脚本的相关操作。

# 引入外部脚本格式
. filename
# 或者
source filename
# 引入01.sh脚本
. ./01.sh
# 或者
source ./01.sh

12. 小结

花了一天多的时间把Linux的基本命令包括Shell脚本又复习了一遍,好多知识之前学过,但是平时使用的太少了,也就不太记得了。过了一遍也学到了一些新的东西,诸如用户管理,用户组管理,端口的开放与关闭,linux软件安装,同时对于Shell脚本的话,这一次是综合学习了一下,但如果要熟练使用还是需要假以时日的在工作真实场景中联系,Shell脚本这次学习了一下case选择判断,以及一些判断中使用到的运算符。Linux中的面试问的较多的命令一般为top/netstat/ps -aux/awk/df/free等相关命令,awk的还需要补充一下。

Keep thinking,keep coding!2021年1月15日17:17:21写于南京,继续加油!

在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值