Linux速成
文章目录
1 前言
1.1 课程介绍
1.2 学习方向
1.3 应用领域
个人桌面领域
此领域是传统 linux 应用最薄弱的环节,传统 linux 由于界面简单、操作复杂、应用软件少的缺点,一直被 windows 所压制,但近些年来随着 ubuntu、fedora、Debian、Manjaro等优秀桌面环境的兴起,同时各大硬件厂商对其支持的加大,linux 在个人桌面领域的占有率在逐渐的提高。
服务器领域
linux 在服务器领域的应用是最强的。
linux 免费、稳定、高效等特点在这里得到了很好的体现,近些年来 linux 服务器市场得到了飞速的提升,尤其在一些高端领域尤为广泛。
嵌入式领域
近些年来 linux 在嵌入式领域的应用得到了飞速的提高
linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百 KB 等特点,使其近些年来在嵌入式领域的应用得到非常大的提高
主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后再物联网中应用会更加广泛
1.4 学习阶段
- linux 环境下的基本操作命令,包括 文件操作命令(rm mkdir chmod, chown) 编辑工具使用(vi vim)linux 用户管理(useradd userdel usermod)等
- linux 的各种配置(环境变量配置,网络配置,服务配置)
- linux 下如何搭建对应语言的运行环境(大数据,JavaEE, Python 等)
- 能编写 shell 脚本,对 Linux 服务器进行维护。
- 能进行安全设置,防止攻击,保障服务器正常运行,能对系统调优。
- 深入理解 Linux 系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。
1.5 学习建议
- 高效而愉快的学习
- 先建立一个整体框架,然后细节
- 不需要掌握所有的 Linux 指令,要学会查询手册和百度
- 先 know how ,再 know why
- 计算机是一门”做中学”的学科,不是会了再做,而是做了才会.
- 适当的囫囵吞枣
- Linux 不是编程,重点是实际操作,各种常用指令要玩的溜
2 linux入门
2.1 linux简介
- Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
- Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。
- Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
- Linux 是一款操作系统,免费,开源, 安全,高效,稳定, 处理高并发非常强悍,现在很多的企业级的项目都部署到 Linux/unix 服务器运行。
其内核于1991年10月5日首次发布
2.2 linux发行版
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
这些发行版的关系如下图
2.3 和unix的关系
unix怎么来的
2.4 linux怎么来的
20世纪80年代,计算机硬件的性能不断提高,PC的市场不断扩大,当时可供计算机选用的操作系统主要有Unix、DOS和iOS这几种。
- Unix价格昂贵,不能运行于PC;
- DOS显得简陋,且源代码被软件厂商严格保密;
- MacOS是一种专门用于苹果计算机的操作系统。
此时,计算机科学领域迫切需要一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少,因此当时在荷兰当教授的美国人AndrewS.Tanenbaum编写了一个操作系统,名为MINIX,为了向学生讲述操作系统内部工作原理。
MINIX虽然很好,但只是一个用于教学目的的简单操作系统,而不是一个强有力的实用操作系统,然而最大的好处就是公开源代码。
全世界学计算机的学生都通过钻研MINIX源代码来了解电脑里运行的MINIX操作系统,芬兰赫尔辛基大学大学二年级的学生Linus Torvalds就是其中一个,在吸收了MINIX精华的基础上,Linus于1991年写出了属于自己的Linux操作系统,版本为Linux0.01,是Linux时代开始的标志。他利用Unix的核心,去除繁杂的核心程序,改写成适用于一般计算机的x86系统,并放在网络上供大家下载,1994年推出完整的核心Version1.0,至此,Linux逐渐成为功能完善、稳定的操作系统,并被广泛使用。
2.5 与windows比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGCtodW4-1653304158045)(file:///D:/%E5%A4%A7%E5%AD%A6/%E4%B8%9C%E8%BD%AF%E5%9F%B9%E8%AE%AD/linux%E6%95%99%E7%A8%8B_files/30a61r1n1csnkjn9d9sfgb39vj.png)]
3 安装虚拟机和CentOS
3.1 vmware 和 centos介绍
VMWare虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMware采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器
下载:
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-16.0.0-16894299.exe
CentOS是免费的、开源的、可以重新分发的开源操作系统 ,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一。
CentOS Linux发行版是一个稳定的,可预测的,可管理的和可复现的平台,源于Red Hat Enterprise Linux(RHEL)依照开放源代码(大部分是GPL开源协议 )规定释出的源码所编译而成。
自2004年3月以来,CentOS Linux一直是社区驱动的开源项目,旨在与RHEL在功能上兼容。
下载:
http://mirrors.163.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
3.2 安装vmware
3.3 安装centos
3.4 联网和使用终端
3.5 设置共享目录
4 linux目录结构
4.1 树状目录
linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在此目录下再创建其他的目录。
深刻理解 linux树状文件目录是非常重要的,这里我给大家说明一下。
记住一句经典的话:在 Linux 世界里,一切皆文件。
4.2 详细介绍
/bin:
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。
/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
/dev:
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。
/lib:
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。
/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
/opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
/proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。
/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。
/selinux:
这个目录是 Redhat/CentOS 所特有的目录,selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
/srv:
该目录存放一些服务启动之后需要提取的数据。
/sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
/tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。
/usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
/usr/bin:
系统用户使用的应用程序。
/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src:
内核源代码默认的放置目录。
/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
/etc:
上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
值得提出的是 /bin、/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。
/var:
这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。
5 远程登录linux
5.1 为什么要远程登录
说明: 公司开发时候, 具体的情况是这样的
-
linux 服务器是开发小组共享的.
-
正式上线的项目是运行在公网的.
-
因此程序员需要远程登录到 centos 进行项目管理或者开发.
-
画出简单的网络拓扑示意图(帮助理解)
-
远程登录客户端有 Xshell, Xftp , 我们学习使用 Xshell 和 Xftp , 其它的远程工具大同小异
5.2 安装和使用xshell
Xshell 是目前最好的远程登录到 Linux 操作的软件,流畅的速度并且完美解决了中文乱码的问题, 是目前程序员首选的软件。
Xshell [1] 是一个强大的安全终端模拟软件,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。
Xshell 可以在 Windows 界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。
特别说明:如果希望安装好 XShell 就可以远程访问 Linux 系统的话,需要有一个前提,就是Linux 启用了 SSHD 服务,该服务会监听 22 号端
5.3 安装和使用xftp
Xftp是一个功能强大的SFTP、FTP 文件传输软件。使用了 Xftp 以后,MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密地协同工作,此外它还为高级用户提供了众多强劲的功能特性。
5.4 开通sshd服务
监听22端口
5.5 乱码问题
6 关机、重启、登录与注销
6.1 关机与重启
shutdown:
shutdown -h now : 表示立即关机
shutdown -h 1 : 表示 1 分钟后关机
shutdown -r now: 立即重启
--------------------------------------------------------------------------------------------
halt:
halt是最简单的关机命令。其原理是调用shutdown -h。
--------------------------------------------------------------------------------------------
poweroff:
poweroff是halt的软连接,最终执行的还是halt命令。
--------------------------------------------------------------------------------------------
reboot:
reboot的工作过程与halt类似,其作用是重新启动。
--------------------------------------------------------------------------------------------
syn :
把内存的数据同步到磁盘
6.2 登录与注销
登录:
ssh root@192.168.142.128
切换用户:
su - 用户名
注销:
logout
exit
7 常用指令
7.1 文件目录类
pwd
显示当前工作目录的绝对路径
print work directory
cd
基本语法
cd [参数]
•功能描述:
切换到指定目录
change directory
•常用参数
绝对路径/xx/xx 和相对路径 ./ ../
cd ~ 或者 cd :回到自己的家目录
cd .. 回到当前目录的上一级目录
•如何理解绝对路径和相对路径
•应用实例
假设你现在/usr/lib目录
案例 1:使用绝对路径切换到 root 目录
案例 2: 使用相对路径到/root 目录
案例 3:表示回到当前目录的上一级目录
案例 4:回到家目录
ls
•基本语法
ls [选项] [目录或是文件]
l
•常用选项
-a :显示当前目录所有的文件和目录,包括隐藏的。
-l :以列表的方式显示信息
-h : 信息的人性化显示(human)
•应用实例
案例:查看当前目录的所有内容信息
mkdir
•基本语法
mkdir [选项] 要创建的目录
•功能描述:
指令用于创建目录(make directory)
•常用选项
-p :创建多级目录
•应用实例
案例 1:创建一个目录 /home/car
案例 2:创建多级目录 /home/animal/dog
rmdir
基本语法:
rmdir [选项] 要删除的空目录
功能描述:
用于删除空目录
应用实例:
案例 1:删除一个目录 /home/dog
使用细节:
rmdir 删除的是空目录,如果目录下有内容时无法删除的。
提示:
如果需要删除非空目录,需要使用 rm -rf 要删除的目录
touch
创建空文件
•基本语法
touch 文件名称
•应用实例
案例 1: 创建一个空文件 hello.txt
cp
拷贝文件到指定目录
•基本语法
cp [选项] source dest
cp 源文件文件夹/文件 目标文件夹
•常用选项
-r :递归复制整个文件夹
使用细节
强制覆盖不提示的方法:\cp
rm
移除【删除】文件或目录
•基本语法
rm [选项] 要删除的文件或目录
•常用选项
-r :递归删除整个文件夹
-f : 强制删除不提示
mv
移动文件与目录或重命名
•基本语法
mv oldNameFile newNameFile (功能描述:重命名)
mv /temp/movefile /targetFolder (功能描述:移动文件)
cat
查看文件内容,是以只读的方式打开。
•基本语法
cat [选项] 要查看的文件
•常用选项
-n :显示行
•使用细节
cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上 管道命令 | more
cat 文件名 | more
more
more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more
指令中内置了若干快捷键,详见操作说明
•基本语法
more 要查看的文件
less
less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
•基本语法
less 要查看的文件
echo
输出内容到控制台。
•基本语法
echo [选项] [输出内容]
>和>>
\> 指令 和 >> 指令
\> 输出重定向 : 会将原来的文件的内容覆盖
\>> 追加: 不会覆盖原来文件的内容,而是追加到文件的尾部。
•基本语法
ls -l > 文件名称 (功能描述:列表的内容写入文件 a.txt 中(覆盖写)
ls -l >> 文件名称 (功能描述:列表的内容写入文件 a.txt 中(不覆盖写)
head
用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容
•基本语法
head 文件名称 (功能描述:查看文件头 10 行内容)
head -n 5 文件名称 (功能描述:查看文件头 5 行内容,5 可以是任意行数
tail
tail 用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的后 10 行内容。
•基本语法
1) tail 文件名称 (功能描述:查看文件后 10 行内容)
2) tail -n 5 文件名称 (功能描述:查看文件后 5 行内容,5 可以是任意行数)
3) tail -f 文件名称 (功能描述:实时追踪该文档的所有更新,工作经常使用, ctrl+c退出)
ln
软链接也叫符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径
•基本语法
ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接
删除软链接
rm -f 软链接名
•细节说明
当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在目录。
history
查看已经执行过历史命令,也可以执行历史指令
•基本语法
history (功能描述:查看已经执行过历史命令)
•应用实例
history
history 10
!15
7.2 时间日期类
date
显示当前日期
•基本语法
1) date (功能描述:显示当前时间)
2) date +%Y (功能描述:显示当前年份)
3) date +%m (功能描述:显示当前月份)
4) date +%d (功能描述:显示当前是哪一天)
5) date "+%Y-%m-%d %H:%M:%S"(功能描述:显示年月日时分秒)
设置系统时间:
date -s "2022-5-18 13:15:16"
cal
查看日历指令
•基本语法
cal
cal 2022
7.3 搜索查找类
find
find 指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。
•基本语法
find [搜索范围] [选项] •选项说明
案例:
1 使用find按文件名来查找语法:find / -name 文件名 ,这里可用通配符*
2 如果想按文件的修改时间来查找可以使用-mtime参数,后面接时间参数 -代表时间内 +代表时间以前
3 如果想按文件有大小来进行查找可以直接使用-size 参数后面加上文件大小即可 (+n 大于 -n 小于 n 等于)
4 如果相针对文件类型进行查找可以直接使用-type参数 ,文件的类型有 文件f 目录d 设备b,c 链接l 等
5 在查找的时候还可以把两个查找类型进行结合起来使用,使用-a代表并且 -o代表或者
6 查找当前目录下所有.txt文件并打印出详细的文件信息
find . -type f -name "*.txt" -exec ls -l {} \;
7 查找当前目录下内容修改时间是30天以前的.log文件并删除 (使用-ok会有提示)
find . -type f -name "*.log" -mtime +30 -exec rm {} \;
find . -type f -name "*.log" -mtime +30 -ok rm {} \;
7.4 locate
locaate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的locate 数据库实现快速定位给定的文件。locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。
locaate
•基本语法
locate 搜索文件
•特别说明
由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。
7.6 grep和管道符号|
grep 过滤查找 , 管道符,"|",表示将前一个命令的处理结果输出传递给后面的命令处理。
•基本语法
grep [选项] 查找内容 源文件
cat a.txt | grep -n yes
7.7 压缩和解压类
gzip 与 gunzip
gzip 用于压缩文件, gunzip 用于解压的
gzip 文件名称 (功能描述:压缩文件,只能将文件压缩为*.gz 文件)
gunzip 文件名称.gz (功能描述:解压缩文件命令)
细节说明:
当我们使用 gzip 对文件进行压缩后,不会保留原来的文件
zip 与 upzip
zip 用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的
•基本语法
zip [选项] XXX.zip 将要压缩的内容(功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip (功能描述:解压缩文件)
•zip 常用选项
-r:递归压缩,即压缩目录
•unzip 的常用选项
-d<目录> :指定解压后文件的存放目录
tar
tar 指令是打包指令,最后打包后的文件是 .tar.gz 的文件。
•基本语法
tar [选项] XXX.tar.gz 打包的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz) •选项说明
7.8 帮助信息类
man
man命令显示的内容是手册页,包含指令帮助、配置文件帮助和编程帮助等信息。一般man命令显示的帮助信息要更加丰富,它比命令的help选项多了命令的用法示例、命令的描述等内容。
help
help命令用于显示shell内部的帮助信息。help命令只能显示shell内部的命令帮助信息。而对于外部命令的帮助信息只能使用man或者info命令查看。
内部命令:就是shell程序的一部分,在系统启动时就加载进入内存,时常驻内存的,所以我们执行内部命令的时候执行速度比较快
外部命令:也就是文件系统命令,它不是shell程序组成部分,是shell程序之外的程序,使用时需要从硬盘读取入内存,所以相对来说速度就慢一点。
区分内部命令和外部命令:使用type命令可以区分,如 type cd
8 用户管理
8.1 介绍
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
在实际的项目中,由于要涉及到多个部门共同参与(如前端、后端、数据组。。。),这时就需要为每位开发人员创建一个用户,为了方便给不同的人分配不同的权限,可以将用户分为不同的组,之后对各个组分配权限就很方便了。
对于创建的每一个用户,都会在/home文件夹下默认创建一个以用户名命名的文件夹,用于该用户文件的存放。
8.2 用户操作
以下均是
8.3 添加用户
useradd 用户名 【当创建用户成功后,会自动的创建和用户同名的家目录,还会创建同名的组】
useradd -d 指定目录 新的用户名 【为新增用户指定家目录】
useradd – g 用户组 用户名
8.4 修改密码
passwd 用户名
注:如果没有带用户名,则是给当前登录的用户修改密码
8.5 删除用户
userdel 用户名
userdel – r 用户名 【删除用户以及用户主目录,小心使用】
8.6 查询用户信息
id 用户名
8.7 切换用户
语法:
su 要切换的用户名
su - 【没有带用户名,则默认切换到 root 用户】
注意:
从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
当需要返回到原来用户时,使用 exit 指令
8.8 查看当前登录用户
whoami
8.9 用户组操作
1 创建令孤冲、张无忌、任盈盈 账号
useradd lhc
useradd zwj
useradd ryy
2 分别给设置密码
passwd lhc
passwd zwj
passwd ryy
3 创建华山派 、武当、魔教 三个组
groupadd hs_g
groupadd wd_g
groupadd mj_g
4 令孤冲归到华山派,张无忌-》武当, 任盈盈-》魔教
usermod -g hs_g lhc
usermod -g wd_g zwj
usermod -g mj_g ryy
5 令孤冲搬家,搬到衡山
mkdir /home/hengshan
usermod -d /home/hengshan lhc
6 令孤冲叛变,投入魔教
usermod -g mj_g lhc
7 把张无忌所在的武当组删除
userdel zwj
groupdel wd_g
8 最后看一下/etc/passwd 和 、/etc/shadow的变化
tail -n 15 /etc/passwd
8.10 新增组
groupadd 组名
8.11 删除组
groupdel 组名
8.12 修改用户的组、初始目录
usermod – g 新的组名 用户名
usermod – d 目录名 用户名
8.13 用户和组的相关文件
/etc/passwd文件
用户(user)的配置文件,记录用户的各种信息
每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell
特殊账号:
8.14 /etc/shadow
口令配置文件
密码生成的算法:
8.15 /etc/group文件
组(group)的配置文件,记录 Linux 包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
9 权限管理
9.1 介绍
Linux中所有内容都是以文件的形式保存和管理,即:一切皆文件。
- 普通文件是文件。
- 目录(在win下称为文件夹)是文件。
- 硬件设备(键盘、硬盘、打印机)是文件。
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制,命令提示符是"#"
- 普通用户:在linux下做有限的事情, 命令提示符是"$"
linux文件对不同用户可以分别设置权限,管理员(root)有所有权限。
文件访问者的分类
- 文件和文件目录的所有者:u—User
- 文件和文件目录的所有者所在的组的用户:g—Group
- 其它用户:o—Others
9.2 查看文件类型和所有者
一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者,当然后期可以改
使用命令查看: ls -l
9.3 权限说明
9.4 修改文件权限-chmod
9.4.1 第一种方式:+ 、-、= 变更权限
使用chmod命令来改变文件的权限,
注:只有文件的拥有者和root用户才能调用chmod命令改变权限
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o 的总和)
- chmod u=rwx,g=rx,o=x 文件目录名
- chmod o+w 文件目录名
- chmod a-x 文件目录名
练习:
创建haha.txt
touch haha.txt
给它设置权限:所有者有读写权限,同一组成员只读,其他人无权限
chmod o-r haha.txt
给同一组成员加上 执行权限
chmod g+x haha.txt
9.4.2 第二种方式:通过数字变更权限
规则:r=4 w=2 x=1 ,rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名
相当于 chmod 751 文件目录名
练习1:
创建hehe.txt
设置所有者rwx , 同一组rw, 其它 r
chmo 764 hehe.txt
练习2:
假设有一个文件a.txt , 它的权限 731
rwx-wx--x
问题解决:
两个用户
chenqf
chenqf2
同属于一个组
java_g
有这么一个文件( ls -lh)
-rw-r---w-. 1 chenqf java_g 11 5月 17 17:15 a.txt
此时, 用户chenqf2拥有可读权限,但是cat /home/chenqf/a.txt 查看时权限,什么原因?怎么办?
原因是因为:
chenqf2用户 没进入 chenqf家目录的权限
怎么办?
让chenqf2拥有进入chenqf家目录的权限, 就是让家目录所有者的同一组成员拥有可执行权限
chmod g+x chenqf
9.5 修改文件所有者-chown
chown newowner file [改变文件的所有者]
chown newowner:newgroup file [改变用户的所有者和所有组]
选项:
-R 如果是目录 则使其下所有子文件或目录递归生效
9.6 修改文件所在组-chgrp
chgrp newgroup file
实战练习:
练习1:
- 练习文件权限管理[课堂练习]
- 建立两个组(神仙,妖怪)
- 建立四个用户(唐僧, 悟空,八戒,沙僧)
- 给四个用户设置密码
- 把悟空,八戒放入妖怪组, 唐僧、沙僧 在神仙
- 用悟空( 切换用户 )建立一个文件 (monkey.java 该文件要输出 i am monkey) echo ‘i am monky’ > monkey.java
- 给八戒一个可以rw 的权限
- 八戒修改 monkey.java 加入一句话( i am pig)
- 设置唐僧、沙僧对该文件没有权限
- 把 沙僧 放入妖怪组
- 让沙僧 修改 该文件 monkey, 加入一句话 (“我是沙僧,我也是妖怪!”);
练习2:
- 用 root 登录,建立用户 lucy,自己设定密码
- 用 lucy 登录,在主目录下建立目录 ff/gg/hh
- 在 hh 中建立一个文本文件 hello.txt, 向 hello.txt 输出 hello,kitty
- 改变 hello.txt 的权限为当前用户可读可写可执行,组用户可读可执行,其他用户只读
- 删除新建立的目录 ff/gg/hh
- 删除用户 lucy 及其主目录中的内容
- 重新启动 linux 或关机
10 vi和vim
10.1 vi和vim介绍
所有的 Linux 系统都会内建 vi 文本编辑器。
Vim 具有程序编辑的能力,可以看做是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确
性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
10.2 三种模式
命令模式: 启动 vim编辑器 后默认进入命令模式,该模式中主要完成如光标移动、字符串查找,以及删除、复制、粘贴文件内容等相关操作;
编辑模式: 该模式中主要的操作就是录入文件内容,可以 对文本文件正文进行修改、或者添加新的内容。处于输入模式时,vi编辑器的最后一行会出现"–INSERT–"的状态提示信息;
末行模式: 该模式中可以设置vi编辑环境、保存文件、退出编辑器,以及对文件内容进行查找、替换等操作。处于末行模式时,vim编辑器的最后一行会出现冒号:提示符。
10.3 各种操作说明
10.3.1 光标移动
10.3.2 复制、粘贴、删除
10.3.3 保存文件及退出vi编辑器
10.3.4 文本内容替换
10.3.5 文件内容查找和撤销编辑及保存退出![img](https://i-blog.csdnimg.cn/blog_migrate/df5deaa8bde4aa7f45b5695f40f19009.png)
10.4 练习游戏:
https://vim-adventures.com/
10.5 实战练习1:
1、 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
2、 进入 vitest 这个目录当中;
3、 将 /etc/man_db.conf 复制到本目录底下(或由上述的连结下载 man.config 档案);
4、 使用 vim 开启本目录下的 man_db.conf 这个档案;
5、 在 vim中设定一下行号;
6、 移动到第 58 行,向右移动10个字符
7、 移动到第一行,并且向下搜寻一下『 man 』这个字符串,请问他在第几行?
8、 接着下来,我要将 50 到 100 行之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』, 结果会在最后一行出现改变了几个 man 呢?
10、 我要复制 65 到 73 这九行的内容(含有MANPATH_MAP),并且贴到最后一行之后;
11、21 到 42 行之间的开头为 # 符号的批注数据我不要了,要如何删除?
12、将这个档案另存成一个 man.test.config 的檔名;
13、去到第 27 行,并且删除 15 个字符,结果出现的第一个单字是什么?
14、在第一行新增一行,该行内容输入『I am a student…』;
15、储存后离开吧!
练习1答案:
1、 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
mkdir /tmp/vitest
2、 进入 vitest 这个目录当中;
[root@Gming ~]# cd /tmp/vitest/
[root@Gming vitest]# pwd
/tmp/vitest
3、 将 /etc/man_db.conf 复制到本目录底下(或由上述的连结下载 man.config 档案);
[root@Gming vitest]# cp /etc/man_db.conf .
[root@Gming vitest]# ls .
man_db.conf
4、 使用 vim 开启本目录下的 man_db.conf 这个档案;
[root@Gming vitest]# vim man_db.conf
5、 在 vim中设定一下行号;
进入末行模式,输入命令 :set number 回车
6、 移动到第 58 行,向右移动 10 个字符
移动到第 58 行:命令模式输入 58,然后敲G
行内向右移动10个字符:命令模式输入 10,然后敲向右键
7、 移动到第一行,并且向下搜寻一下『 man 』这个字符串,请问他在第几行?
gg
命令模式直接输入:/man ,敲回车
8、 接着下来,我要将 50 到 100 行之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』, 结果会在最后一行出现改变了几个 man 呢?
末行模式输入 :50,100 s/man/MAN/c
9、 修改完之后,突然反悔了,要全部复原,有哪些方法?
u是返回上一步操作,U则是清除所有操作
10、 我要复制 65 到 73 这九行的内容(含有MANPATH_MAP),并且贴到最后一行之后;
末行模式 :65,73 co $
11、21 到 42 行之间的开头为 # 符号的批注数据我不要了,要如何删除?
末行模式 :21,42 s/^#//
12、将这个档案另存成一个 man.test.config 的檔名;
末行模式 :w man.test.config
13、去到第 27 行,并且删除 15 个字符,结果出现的第一个单字是什么?
命令模式输入27敲G到第27行,输入15按x后查看即可
14、在第一行新增一行,该行内容输入『I am a student…』;
命令模式 输入1按G到第1行,然后按O从当前光标的上一行进入插入模式,插入内容『I am a student…』
15、储存后离开吧!
进入末行模式 :wq 保存退出
10.6 实战练习2:
1 复制系统/etc/services文件到/root目录,然后使用vim命令打开此文件。
2 显示该文件的行号
3 显示该文件的每一行结尾的标识符
4 替换文件中所有的"ssh"字符串替换成"oldboy"
5 跳转到30行,并删除此行。
6 撤销一次你的操作。
7 当你执行了撤销的时候,发现撤销错了,回滚,怎么操作。
8 给第25行到30行的行首添加一个注释"#".写出操作步骤。
9 删除第10行到20行的行首的注释"#".写出操作步骤。
练习2答案:
1 复制系统/etc/services文件到/root目录,然后使用vim命令打开此文件。
[root@Gming vitest]# cp /etc/services /root
2 显示该文件的行号
:set number
3 显示该文件的每一行结尾的标识符
:set list
4 替换文件中所有的"ssh"字符串替换成"oldboy"
:% s/ssh/oldboy/g
5 跳转到30行,并删除此行。
:30 或30G
dd
6 撤销一次你的操作。
命令模式输入 u
7 当你执行了撤销的时候,发现撤销错了,回滚,怎么操作。
Ctrl +r
8 给第25行到30行的行首添加一个注释"#".写出操作步骤。
:25,30 s/^/#
9 删除第10行到20行的行首的注释"#".写出操作步骤。
:10,20 s/^#//
10 vim编辑文件时,非正常退出,再从新编辑文件时,出现报错,怎么解决,写出解决步骤。
在输入vim -r services
rm -f .services.swp
注意:先查看是否有别的用户在编辑这个文件 ,用w查看
11 磁盘分区挂载
11.1 硬盘类型
对于Linux而言硬件是作为设备来进行管理的,每个硬件设备有对应的文件,文件都存储在/dev目录中
分区设备的文件名:
对于一个硬盘如果进行了分区,则在每个硬盘的文件名后面加上数字用来指代分区,例如/dev/sda1,表示sda硬盘的第一个分区
[a-d]解释:(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘)
主分区用数字1-4来指代
逻辑分区从数字5开始按顺序进行指代
11.2 分区基本知识
11.2.1 mbr 分区:
1.最多支持四个主分区
2.系统只能安装在主分区
3.扩展分区要占一个主分区
4.MBR 最大只支持 2TB,但拥有最好的兼容性
11.2.1 gtp 分区:
1.支持无限多个主分区(但操作系统可能限制,比如 windows 下最多 128 个分区)
2.最大支持 18EB 的大容量(1EB=1024 PB,1PB=1024 TB )
3.windows7 64 位以后支持 gtp
11.3 windows和linux查看分区格式
windows:
右击我的电脑 -> 管理 -> 磁盘管理 -> 右击磁盘0 -> 属性 -> 卷
linux :
fdisk -l
parted -l
11.4 linux分区
11.4.1 原理介绍
Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系统的一部分。
Linux 采用了一种叫"载入"的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得
11.4.2 查看分区情况
lsblk 或者 lsblk -f
11.5 增加硬盘并挂载
11.5.1 示意图
整体步骤:
- 虚拟机添加硬盘
- 分区 fdisk /dev/sdb
- 格式化 mkfs -t ext4 /dev/sdb1
- 挂载 先创建一个 /home/newdisk , 挂载 mount /dev/sdb1 /home/newdisk
- 设置可以自动挂载(永久挂载,当你重启系统,仍然可以挂载到 /home/newdisk)
11.6 具体步骤
11.6.1 虚拟机添加硬盘
- 选中 目标虚拟机 右键 设置
- 点击左下角添加,
- 选中硬盘,点击 下一步
- 选择SCSI类型,点击 下一步
- 选择 创建新虚拟磁盘,点击 下一步
- 指定 磁盘大小为10G,点击 下一步
- 点击完成
- 注意: 重启 才可以生效
- 重启后查看是否多了一个硬盘sdb
11.6.2 分区
- fdisk /dev/sdb 开始分区
- 输入 n , 新增分区
- 输入 p , 开始分区, 后面按回车
- 最后 输入 w , 保存 且 退出
- lsblk -f 查看是否成功
11.6.3 格式化
mkfs -t ext4 /dev/sdb1
-t :表示指定文件系统格式为ext4
11.6.4 挂载
将 /dev/sdb1 挂载到 /home/newdisk 目录
1 创建目录 mkdir -p /home/newdisk
2 执行 mount /dev/sdb1 /home/newdisk 建立设备分区和系统目录的映射关系
3 lsblk -f 查看是否挂载成功
如果是卸载:
•umount 设备名称 或者 挂载目录
•例如: umount /dev/sdb1 或者 umount /newdisk
11.6.5 设置永久挂载
经过上面步骤已经挂载后了,但重启后发现又失效了,怎么办?
1: 将映射关系写到配置文件中 /etc/fstab
vim /etc/fstab
2: mount -a 重新加载 /etc/fstab 文件 ;
3: 重启操作系统后, 测试 lsblk -f
11.7 查看磁盘使用情况
11.8 查看目录占用磁盘空间情况
查询指定目录的磁盘占用情况,默认为当前目录
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth=1 子目录深度
-c 列出明细的同时,增加汇总值
11.9 统计某个目录下文件个数
统计/home 目录下文件的个数
ls -l | grep '^-' | wc -l
如果要统计包含的子目录,以及子目录的子目录下的文件个数怎么办?
11.10 统计某个目录下子目录个数
统计/home 目录下子目录的个数
ls -l | grep '^d' | wc -l
12 网络配置
Bridge
Nat
only host
13 进程与服务管理
13.1 进程管理
13.2 基本介绍
- 在 LINUX 中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个 ID 号。
- 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。例如 www 服务器。
- 每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
- 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束。
13.3 查看系统进程
查看进行使用的指令是 ,一般来说使用的参数是 ps -aux
-e 显示所有进程。
-h 不显示标题。
-l 长格式。
-w 宽输出。
-a 显示终端上的所有进程,包括其他用户的进程。
-r 只显示正在运行的进程。
-x 显示没有控制终端的进程。
-f 全部列出,通常和其他选项联用。
-u 以用户为主的格式来显示程序状况
13.4 进程信息说明
13.4.1 ps -aux
ps -aux
• USER:进程使用者
• PID :程序的id
• %CPU:占用cpu的比例
• %MEM:占用内存的比例
• VSZ:该进程使用的虚拟內存量(KB)
• RSS:该进程占用的固定內存量(KB)
• TTY :登入者的终端机位置若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
• STAT :进程状态
- D 不可中断 Uninterruptible(usually IO)
- R 正在运行或在队列中的进程
- S 处于休眠状态
- T 停止或被追踪
- Z 僵尸进程
- W 进入内存交换(从内核2.6开始无效)
- X 死掉的进程
- < 高优先级
- n 低优先级
- s 包含子进程
- + 位于后台的进程组
• START:进程开始时间
• TIME:实际使用cpu的时间
• COMMAND:所下达的是什么指令
13.4.2 ps -ef
ps -ef | more
•UID:用户 ID
•PID:进程 ID
•PPID:父进程 ID
•C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会
降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
•STIME:进程启动的时间
•TTY:完整的终端名称
•TIME:CPU 时间
•CMD:启动进程所用的命令和参数
13.5 终止进程
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。
使用 kill 命令来完成此项任务。
基本语法:
- kill [选项] 进程号(功能描述:通过进程号杀死进程)
- killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
-9 :表示强迫进程立即停止
13.6 查看进程树
pstree [选项] ,可以更加直观的来看进程信息
-p :显示进程的 PID
-u :显示进程的所属用户
13.7 服务管理
13.8 基本介绍
服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。【原理图】
13.9 service指令
service 服务名 [start | stop | restart | reload | status]
13.10 查看有哪些服务
- setup
- ls -l /etc/init.d
13.10.1 chkconfig
chkconfig --list 列出所有的系统服务
chkconfig --add httpd 将httpd添加为受chkconfig管理的服务:
chkconfig --del httpd 删除httpd服务
chkconfig --level 35 httpd on 在级别3和5上设定服务为“on”,开机自动启动也是配置这个
chkconfig --level 01246 httpd off 在其他级别上设为off
为了确认你的配置被正确的修改了,我们可以列出服务将会运行的运行级别,如下所示:
#chkconfig --list httpd
httpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
----------------
chkconfig 重新设置服务后自启动或关闭,需要重启机器 reboot 才能生
13.11 动态监控进程
#top
- top:输入此命令,按回车键,查看执行的进程。
- u:然后输入“u”回车,再输入用户名,即可
- k:然后输入“k”回车,再输入要结束的进程 ID
14 shell编程
14.1 shell概述
14.2 什么是shell
Shell就是用户与Linux内核之间的解释器,负责将用户的指令翻译为内核可以识别的指令。
14.3 什么是shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
![](https://i-blog.csdnimg.cn/blog_migrate/d098759a9f58a50b777bda804f07bdbf.jpeg)
14.4 谁要学习shell
Linux运维工程师:编写Shell程序进行服务集群管理。
Python和JavaEE程序员:编写Shell脚本程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
大数据程序员:编写Shell程序来管理集群。
…
14.5 有哪些shell
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
…
bash 和 sh 的关系
# cd /bin
# ll | grep bash
-rwxr-xr-x. 1 root root 941880 5 月 11 2016 bash
lrwxrwxrwx. 1 root root 4 5 月 27 2017 sh -> bash Centos
默认的解析器是 bash
# echo $SHELL /bin/bash
14.6 第1个shell脚本
vim hello.sh
说明:
#! 告诉系统这个脚本需要什么解释器来执行。
文件扩展名 .sh 不是强制要求的。
- 方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
- 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。
14.7 变量
定义
-
Shell 变量分为系统变量和自定义变量。系统变量有 H O M E 、 HOME、 HOME、PWD、$USER等,显示当前 Shell 中所有变量:set 。
-
变量名可以由字母、数字、下划线组成,不能以数字开头。
基本语法
- 定义变量:变量名=变量值,等号两侧不能有空格,变量名一般习惯用大写。
- 删除变量:unset 变量名 。
- 声明静态变量:readonly 变量名,静态变量不能unset。
- 使用变量:$变量名
将命令返回值赋给变量(重点)
- A=
ls
反引号(``),执行里面的命令 - A=$(ls) 等价于反引号
14.8 环境变量
定义
基本语法
- export 变量名=变量值,将 Shell 变量输出为环境变量。
- source 配置文件路径,让修改后的配置信息立即生效。
- echo $变量名,检查环境变量是否生效
14.9 位置参数变量
基本语法
- $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
- $* :命令行中所有参数,且把所有参数看成一个整体。
- $@ :命令行中所有参数,且把每个参数区分对待。
- $# :所有参数个数。
实例:
编写 Shell 脚本 positionPara.sh ,输出命令行输入的各个参数信息。
#!/bin/bash
# 输出各个参数
echo $0 $1 $2
echo $*
echo $@
echo 参数个数=$#
运行:
chmod +x positionPara.sh
./positionPara.sh 10 20
运行结果:
./positionPara.sh 10 20
10 20
10 20
参数个数=2
14.10 预定义变量
定义
在赋值定义之前,事先在 Shell 脚本中直接引用的变量。
基本语法
- $$ :当前进程的 PID 进程号。
- $! :后台运行的最后一个进程的 PID 进程号。
- $? :最后一次执行的命令的返回状态,0为执行正确,非0执行失败。
实例:
编写 Shell 脚本 prePara.sh ,输出命令行输入的各个参数信息。
#!/bin/bash
echo 当前的进程号=$$
# &:以后台的方式运行程序
./hello.sh &
echo 最后一个进程的进程号=$!
echo 最后执行的命令结果=$?
运行结果:
当前的进程号=41752
最后一个进程的进程号=41753
最后执行的命令结果=0 # hello world!
14.11 运算符
基本语法
- $((运算式)) 或 $[运算式]
- expr m + n 注意 expr 运算符间要有空格
- expr m - n
- expr *,/,% 分别代表乘,除,取余
实例
# 第1种方式 $(())
echo $(((2+3)*4))
# 第2种方式 $[],推荐
echo $[(2+3)*4]
# 使用 expr
TEMP=`expr 2 + 3`
echo `expr $TEMP \* 4
14.12 条件判断
基本语法
[ condition ] 注意condition前后要有空格。非空返回0,0为 true,否则为 false 。
实例
#!/bin/bash
if [ 'test01' = 'test' ]
then
echo '等于'
fi
# 20是否大于10
if [ 20 -gt 10]
then
echo '大于'
fi
# 是否存在文件/root/shell/a.txt
if [ -e /root/shell/a.txt ]
then
echo '存在'
fi
if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world' ]
then
echo '条件满足,执行后面的语句'
fi
运行结果:
大于
hello
条件满足,执行后面的语句
14.13 流程控制
14.13.1 if判断
基本语法
if [ 条件判断式 ];then
程序
fi
# 或者(推荐)
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
实例e
编写 Shell 程序:如果输入的参数大于60,输出“及格”,否则输出“不及格”。
#!/bin/bash
if [ $1 -ge 60 ]
then
echo 及格
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
14.13.2 case分支
基本语法
case $变量名 in
"值1")
如果变量值等于值1,则执行此处程序1
;;
"值2")
如果变量值等于值2,则执行此处程序2
;;
...省略其它分支...
*)
如果变量值不等于以上列出的值,则执行此处程序
;;
esac
实例
当命令行参数为1时输出“周一”,2时输出“周二”,其他情况输出“其它”。
case $1 in
"1")
echo 周一
;;
"2")
echo 周二
;;
*)
echo 其它
;;
esac
14.13.3 for 循环
基本语法
# 语法1
for 变量名 in 值1 值2 值3...
do
程序
done
# 语法2
for ((初始值;循环控制条件;变量变化))
do
程序
done
实例
1.打印命令行输入的参数。
#!/bin/bash
# 使用$*
for i in "$*"
do
echo "the arg is $i"
done
echo "=================="
# 使用$@
for j in "$@"
do
echo "the arg is $j"
done
运行结果(回顾一下 $* 和 $@ 的区别):
the arg is 1 2 3
==================
the arg is 1
the arg is 2
the arg is 3
- 输出从1加到100的值。
#!/bin/bash
SUM=0
for ((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM
14.13.4 while 循环
基本语法
while [ 条件判断式 ]
do
程序
done
实例
输出从1加到100的值。
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
14.14 读取控制台输入
基本语法
- read(选项)(参数)
- 选项
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,就不再等待了。
参数
变量名:读取值的变量名
实例
读取控制台输入一个num值。
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "你输入num1的值是:$NUM1"
read -t 10 -p "请在10秒内输入一个数num2=" NUM2
echo "你输入num2的值是:$NUM2"
运行结果:
请输入一个数num1=10
你输入num1的值是:10
请在10秒内输入一个数num2=20
你输入num2的值是:20
14.15 函数
14.15.1 系统函数
basename,删掉路径最后一个 / 前的所有部分(包括/),常用于获取文件名。
基本语法
- basename [pathname] [suffix]
- basename [string] [suffix]
- 如果指定 suffix,也会删掉pathname或string的后缀部分。
实例
# basename /usr/bin/sort
sort
# basename include/stdio.h
stdio.h
# basename include/stdio.h .h
stdio
dirname,删掉路径最后一个 / 后的所有部分(包括/),常用于获取文件路径。
基本语法
- dirname pathname
- 如果路径中不含 / ,则返回 ‘.’ (当前路径)。
实例
# dirname /usr/bin/
/usr
# dirname dir1/str dir2/str
dir1
dir2
# dirname stdio.h
.
14.15.2 自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
# 调用
funname 参数1 参数2...
实例
计算输入两个参数的和。
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个参数n1:" n1
read -p "请输入第二个参数n2:" n2
# 调用 getSum 函数
getSum $n1 $n2
14.16 实战练习
1 编写一个 Shell 程序 mkf,此程序的功能是:显示 root 下的文件信息,然后建立一个 kk 的文件夹,进入该文件夹下建立一个文件 aa,修改此文件的权限为可执行
2 判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
3 给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
4 编写shell脚本,打印乘法口诀表
5 循环接收用户输入的一个年份,写一个函数判断是否是闰年,当用户输入q时退出
14.17 综合案例
14.17.1 归档文件
实际生产应用中,往往需要对重要数据进行归档备份。
需求:
实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/), 将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive 下。
这里用到了归档命令:tar
后面可以加上-c 选项表示归档,加上-z 选项表示同时进行压缩,得到的文件后缀名 为.tar.gz。
脚本实现如下:
#!/bin/bash
# 首先判断输入参数个数是否为1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在!"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题!"
echo
fi
exit
15 任务调度
16 rpm和yum
17 搭建javaee运行环境
`
14.13.4 while 循环
基本语法
while [ 条件判断式 ]
do
程序
done
实例
输出从1加到100的值。
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
14.14 读取控制台输入
基本语法
- read(选项)(参数)
- 选项
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,就不再等待了。
参数
变量名:读取值的变量名
实例
读取控制台输入一个num值。
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "你输入num1的值是:$NUM1"
read -t 10 -p "请在10秒内输入一个数num2=" NUM2
echo "你输入num2的值是:$NUM2"
运行结果:
请输入一个数num1=10
你输入num1的值是:10
请在10秒内输入一个数num2=20
你输入num2的值是:20
14.15 函数
14.15.1 系统函数
basename,删掉路径最后一个 / 前的所有部分(包括/),常用于获取文件名。
基本语法
- basename [pathname] [suffix]
- basename [string] [suffix]
- 如果指定 suffix,也会删掉pathname或string的后缀部分。
实例
# basename /usr/bin/sort
sort
# basename include/stdio.h
stdio.h
# basename include/stdio.h .h
stdio
dirname,删掉路径最后一个 / 后的所有部分(包括/),常用于获取文件路径。
基本语法
- dirname pathname
- 如果路径中不含 / ,则返回 ‘.’ (当前路径)。
实例
# dirname /usr/bin/
/usr
# dirname dir1/str dir2/str
dir1
dir2
# dirname stdio.h
.
14.15.2 自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
# 调用
funname 参数1 参数2...
实例
计算输入两个参数的和。
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个参数n1:" n1
read -p "请输入第二个参数n2:" n2
# 调用 getSum 函数
getSum $n1 $n2
14.16 实战练习
1 编写一个 Shell 程序 mkf,此程序的功能是:显示 root 下的文件信息,然后建立一个 kk 的文件夹,进入该文件夹下建立一个文件 aa,修改此文件的权限为可执行
2 判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
3 给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
4 编写shell脚本,打印乘法口诀表
5 循环接收用户输入的一个年份,写一个函数判断是否是闰年,当用户输入q时退出
14.17 综合案例
14.17.1 归档文件
实际生产应用中,往往需要对重要数据进行归档备份。
需求:
实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/), 将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive 下。
这里用到了归档命令:tar
后面可以加上-c 选项表示归档,加上-z 选项表示同时进行压缩,得到的文件后缀名 为.tar.gz。
脚本实现如下:
#!/bin/bash
# 首先判断输入参数个数是否为1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在!"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题!"
echo
fi
exit