Linux60个小时速成

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Linux速成

文章目录

1 前言

1.1 课程介绍

img

1.2 学习方向

img

1.3 应用领域

个人桌面领域

​ 此领域是传统 linux 应用最薄弱的环节传统 linux 由于界面简单、操作复杂、应用软件少的缺点一直被 windows 所压制但近些年来随着 ubuntu、fedora、Debian、Manjaro等优秀桌面环境的兴起同时各大硬件厂商对其支持的加大linux 在个人桌面领域的占有率在逐渐的提高。

服务器领域

​ linux 在服务器领域的应用是最强的。

​ linux 免费、稳定、高效等特点在这里得到了很好的体现近些年来 linux 服务器市场得到了飞速的提升尤其在一些高端领域尤为广泛。

嵌入式领域

​ 近些年来 linux 在嵌入式领域的应用得到了飞速的提高

​ linux 运行稳定、对网络的良好支持性、低成本且可以根据需要进行软件裁剪内核最小可以达到几百 KB 等特点使其近些年来在嵌入式领域的应用得到非常大的提高

​ 主要应用机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后再物联网中应用会更加广泛

1.4 学习阶段

  1. linux 环境下的基本操作命令包括 文件操作命令(rm mkdir chmod, chown) 编辑工具使用vi vimlinux 用户管理(useradd userdel usermod)等
  2. linux 的各种配置环境变量配置网络配置服务配置
  3. linux 下如何搭建对应语言的运行环境大数据JavaEE, Python 等
  4. 能编写 shell 脚本对 Linux 服务器进行维护。
  5. 能进行安全设置防止攻击保障服务器正常运行能对系统调优。
  6. 深入理解 Linux 系统对内核有研究熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。

1.5 学习建议

  1. 高效而愉快的学习
  2. 先建立一个整体框架然后细节
  3. 不需要掌握所有的 Linux 指令要学会查询手册和百度
  4. 先 know how ,再 know why
  5. 计算机是一门”做中学”的学科,不是会了再做而是做了才会.
  6. 适当的囫囵吞枣
  7. Linux 不是编程重点是实际操作各种常用指令要玩的溜

2 linux入门

2.1 linux简介

  1. Linux 内核最初只是由芬兰人林纳斯·托瓦兹Linus Torvalds在赫尔辛基大学上学时出于个人爱好而编写的。
  2. Linux 是一套免费使用和自由传播的类 Unix 操作系统是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。
  3. Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想是一个性能稳定的多用户网络操作系统。
  4. Linux 是一款操作系统免费开源 安全高效稳定 处理高并发非常强悍现在很多的企业级的项目都部署到 Linux/unix 服务器运行。

其内核于1991年10月5日首次发布

img

2.2 linux发行版

目前市面上较知名的发行版有Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

img

这些发行版的关系如下图

img

2.3 和unix的关系

unix怎么来的

img

2.4 linux怎么来的

​ 20世纪80年代计算机硬件的性能不断提高PC的市场不断扩大当时可供计算机选用的操作系统主要有Unix、DOS和iOS这几种。

  1. Unix价格昂贵不能运行于PC
  2. DOS显得简陋且源代码被软件厂商严格保密
  3. MacOS是一种专门用于苹果计算机的操作系统。

​ 此时计算机科学领域迫切需要一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少因此当时在荷兰当教授的美国人AndrewS.Tanenbaum编写了一个操作系统名为MINIX为了向学生讲述操作系统内部工作原理。

​ MINIX虽然很好但只是一个用于教学目的的简单操作系统而不是一个强有力的实用操作系统然而最大的好处就是公开源代码。

​ 全世界学计算机的学生都通过钻研MINIX源代码来了解电脑里运行的MINIX操作系统芬兰赫尔辛基大学大学二年级的学生Linus Torvalds就是其中一个在吸收了MINIX精华的基础上Linus于1991年写出了属于自己的Linux操作系统版本为Linux0.01是Linux时代开始的标志。他利用Unix的核心去除繁杂的核心程序改写成适用于一般计算机的x86系统并放在网络上供大家下载1994年推出完整的核心Version1.0至此Linux逐渐成为功能完善、稳定的操作系统并被广泛使用。

img

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是免费的、开源的、可以重新分发的开源操作系统 CentOSCommunity Enterprise Operating System中文意思是社区企业操作系统是Linux发行版之一。

CentOS Linux发行版是一个稳定的可预测的可管理的和可复现的平台源于Red Hat Enterprise LinuxRHEL依照开放源代码大部分是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 世界里一切皆文件。

img

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 为什么要远程登录

说明: 公司开发时候 具体的情况是这样的

  1. linux 服务器是开发小组共享的.

  2. 正式上线的项目是运行在公网的.

  3. 因此程序员需要远程登录到 centos 进行项目管理或者开发.

  4. 画出简单的网络拓扑示意图(帮助理解)

  5. 远程登录客户端有 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 要查看的文件

img

less
	less 指令用来分屏查看文件内容它的功能与 more 指令类似但是比 more 指令更加强大支持各种显示终端。less 指令在显示文件内容时并不是一次将整个文件加载之后才显示而是根据显示需要加载内容对于显示大型文件具有较高的效率。


•基本语法

less 要查看的文件

img

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

img

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) •选项说明

img

7.8 帮助信息类

man

	man命令显示的内容是手册页包含指令帮助、配置文件帮助和编程帮助等信息。一般man命令显示的帮助信息要更加丰富它比命令的help选项多了命令的用法示例、命令的描述等内容。
help

help命令用于显示shell内部的帮助信息。help命令只能显示shell内部的命令帮助信息。而对于外部命令的帮助信息只能使用man或者info命令查看。


内部命令就是shell程序的一部分在系统启动时就加载进入内存时常驻内存的所以我们执行内部命令的时候执行速度比较快

外部命令也就是文件系统命令它不是shell程序组成部分是shell程序之外的程序使用时需要从硬盘读取入内存所以相对来说速度就慢一点。


区分内部命令和外部命令使用type命令可以区分如 type cd

8 用户管理

8.1 介绍

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

​ 在实际的项目中由于要涉及到多个部门共同参与如前端、后端、数据组。。。这时就需要为每位开发人员创建一个用户为了方便给不同的人分配不同的权限可以将用户分为不同的组之后对各个组分配权限就很方便了。

对于创建的每一个用户都会在/home文件夹下默认创建一个以用户名命名的文件夹用于该用户文件的存放。

img

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

img

特殊账号

img

8.14 /etc/shadow

口令配置文件

img

密码生成的算法

img

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

img

9.3 权限说明

img

img

9.4 修改文件权限-chmod

9.4.1 第一种方式+ 、-、= 变更权限

使用chmod命令来改变文件的权限

注只有文件的拥有者和root用户才能调用chmod命令改变权限

u:所有者 g:所有组 o:其他人 a:所有人(u、g、o 的总和)

  1. chmod u=rwx,g=rx,o=x 文件目录名
  2. chmod o+w 文件目录名
  3. 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 517 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

  1. 练习文件权限管理[课堂练习]
  2. 建立两个组神仙,妖怪
  3. 建立四个用户(唐僧, 悟空八戒沙僧)
  4. 给四个用户设置密码
  5. 把悟空八戒放入妖怪组 唐僧、沙僧 在神仙
  6. 用悟空( 切换用户 )建立一个文件 monkey.java 该文件要输出 i am monkey echo ‘i am monky’ > monkey.java
  7. 给八戒一个可以rw 的权限
  8. 八戒修改 monkey.java 加入一句话( i am pig)
  9. 设置唐僧、沙僧对该文件没有权限
  10. 把 沙僧 放入妖怪组
  11. 让沙僧 修改 该文件 monkey, 加入一句话 (“我是沙僧我也是妖怪!”);

练习2

  1. 用 root 登录建立用户 lucy,自己设定密码
  2. 用 lucy 登录在主目录下建立目录 ff/gg/hh
  3. 在 hh 中建立一个文本文件 hello.txt, 向 hello.txt 输出 hello,kitty
  4. 改变 hello.txt 的权限为当前用户可读可写可执行组用户可读可执行其他用户只读
  5. 删除新建立的目录 ff/gg/hh
  6. 删除用户 lucy 及其主目录中的内容
  7. 重新启动 linux 或关机

10 vi和vim

10.1 vi和vim介绍

所有的 Linux 系统都会内建 vi 文本编辑器。

​ Vim 具有程序编辑的能力可以看做是 Vi 的增强版本可以主动的以字体颜色辨别语法的正确

性方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富在程序员中被广泛使用。

10.2 三种模式

​ 命令模式 启动 vim编辑器 后默认进入命令模式该模式中主要完成如光标移动、字符串查找以及删除、复制、粘贴文件内容等相关操作

​ 编辑模式 该模式中主要的操作就是录入文件内容可以 对文本文件正文进行修改、或者添加新的内容。处于输入模式时vi编辑器的最后一行会出现"–INSERT–"的状态提示信息

​ 末行模式 该模式中可以设置vi编辑环境、保存文件、退出编辑器以及对文件内容进行查找、替换等操作。处于末行模式时vim编辑器的最后一行会出现冒号:提示符。

img

10.3 各种操作说明

10.3.1 光标移动

img

10.3.2 复制、粘贴、删除

img

10.3.3 保存文件及退出vi编辑器

img

10.3.4 文本内容替换

img

10.3.5 文件内容查找和撤销编辑及保存退出img

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、 接着下来我要将 50100 行之间的『小写 man 字符串』改为『大写 MAN 字符串』并且一个一个挑选是否需要修改如何下达指令如果在挑选过程中一直按『y』 结果会在最后一行出现改变了几个 man 呢

末行模式输入 :50,100 s/man/MAN/c


9、 修改完之后突然反悔了要全部复原有哪些方法

u是返回上一步操作U则是清除所有操作


10、 我要复制 6573 这九行的内容(含有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目录中

img

分区设备的文件名

对于一个硬盘如果进行了分区则在每个硬盘的文件名后面加上数字用来指代分区例如/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 PB1PB=1024 TB

3.windows7 64 位以后支持 gtp

11.3 windows和linux查看分区格式

windows:

右击我的电脑 -> 管理 -> 磁盘管理 -> 右击磁盘0 -> 属性 -> 卷

img

linux : fdisk -l

img

parted -l

img

11.4 linux分区

11.4.1 原理介绍

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

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

11.4.2 查看分区情况

lsblk 或者 lsblk -f

img

11.5 增加硬盘并挂载

11.5.1 示意图

img

整体步骤

  1. 虚拟机添加硬盘
  2. 分区 fdisk /dev/sdb
  3. 格式化 mkfs -t ext4 /dev/sdb1
  4. 挂载 先创建一个 /home/newdisk , 挂载 mount /dev/sdb1 /home/newdisk
  5. 设置可以自动挂载(永久挂载当你重启系统仍然可以挂载到 /home/newdisk)

11.6 具体步骤

11.6.1 虚拟机添加硬盘

  1. 选中 目标虚拟机 右键 设置
  2. 点击左下角添加
  3. 选中硬盘点击 下一步
  4. 选择SCSI类型点击 下一步
  5. 选择 创建新虚拟磁盘点击 下一步
  6. 指定 磁盘大小为10G点击 下一步
  7. 点击完成
  8. 注意: 重启 才可以生效
  9. 重启后查看是否多了一个硬盘sdb

img

11.6.2 分区

  1. fdisk /dev/sdb 开始分区
  2. 输入 n , 新增分区
  3. 输入 p , 开始分区, 后面按回车
  4. 最后 输入 w , 保存 且 退出
  5. lsblk -f 查看是否成功

img

img

11.6.3 格式化

mkfs -t ext4 /dev/sdb1

-t 表示指定文件系统格式为ext4

img

11.6.4 挂载

将 /dev/sdb1 挂载到 /home/newdisk 目录

1 创建目录 mkdir -p /home/newdisk

2 执行 mount /dev/sdb1 /home/newdisk 建立设备分区和系统目录的映射关系

3 lsblk -f 查看是否挂载成功

img

如果是卸载

•umount 设备名称 或者 挂载目录

•例如 umount /dev/sdb1 或者 umount /newdisk

11.6.5 设置永久挂载

经过上面步骤已经挂载后了但重启后发现又失效了怎么办

1: 将映射关系写到配置文件中 /etc/fstab

vim /etc/fstab

img

2: mount -a 重新加载 /etc/fstab 文件 ;

img

3: 重启操作系统后, 测试 lsblk -f

11.7 查看磁盘使用情况

img

11.8 查看目录占用磁盘空间情况

img

查询指定目录的磁盘占用情况默认为当前目录

-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 基本介绍

  1. 在 LINUX 中每个执行的程序代码都称为一个进程。每一个进程都分配一个 ID 号。
  2. 每一个进程都会对应一个父进程而这个父进程可以复制多个子进程。例如 www 服务器。
  3. 每个进程都可能以两种方式存在的。前台与后台所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作但由于屏幕上无法看到的进程通常使用后台方式执行。
  4. 一般系统的服务都是以后台进程的方式存在而且都会常驻在系统中。直到关机才才结束。

13.3 查看系统进程

查看进行使用的指令是 ,一般来说使用的参数是 ps -aux


-e 显示所有进程。

-h 不显示标题。

-l 长格式。

-w 宽输出。

-a 显示终端上的所有进程包括其他用户的进程。

-r 只显示正在运行的进程。

-x 显示没有控制终端的进程。

-f 全部列出通常和其他选项联用。

-u 以用户为主的格式来显示程序状况

13.4 进程信息说明

13.4.1 ps -aux

ps -aux

img

• 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

•CCPU 用于计算执行优先级的因子。数值越大表明进程是 CPU 密集型运算执行优先级会

降低数值越小表明进程是 I/O 密集型运算执行优先级会提高

•STIME进程启动的时间

•TTY完整的终端名称

•TIMECPU 时间

•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 查看有哪些服务

  1. setup
  2. 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

  1. top输入此命令按回车键查看执行的进程。
  2. u然后输入“u”回车再输入用户名即可
  3. k然后输入“k”回车再输入要结束的进程 ID

img

14 shell编程

14.1 shell概述

14.2 什么是shell

Shell就是用户与Linux内核之间的解释器负责将用户的指令翻译为内核可以识别的指令。

img

14.3 什么是shell脚本

Shell 脚本shell script是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本但读者朋友要知道shell 和 shell script 是两个不同的概念。

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

img

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

img

img

说明

#! 告诉系统这个脚本需要什么解释器来执行。

​ 文件扩展名 .sh 不是强制要求的。

  1. 方法1 直接运行解释器hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息第一行可以去掉。
  2. 方法2 hello.sh 作为可执行程序运行Shell 脚本第一行一定要指定解释器。

14.7 变量

定义

  • ​ Shell 变量分为系统变量和自定义变量。系统变量有 H O M E 、 HOME、 HOMEPWD、$USER等显示当前 Shell 中所有变量set 。

  • 变量名可以由字母、数字、下划线组成不能以数字开头。

基本语法

  • 定义变量变量名=变量值等号两侧不能有空格变量名一般习惯用大写。
  • 删除变量unset 变量名 。
  • 声明静态变量readonly 变量名静态变量不能unset。
  • 使用变量$变量名

将命令返回值赋给变量重点

  • A=ls 反引号(``),执行里面的命令
  • A=$(ls) 等价于反引号

14.8 环境变量

定义

img

基本语法

  1. export 变量名=变量值将 Shell 变量输出为环境变量。
  2. source 配置文件路径让修改后的配置信息立即生效。
  3. 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前后要有空格。非空返回00为 true否则为 false 。

img

实例

#!/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. 输出从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

15 任务调度

16 rpm和yum

17 搭建javaee运行环境

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux