linux操作系统
linux操作系统

第一章 初识LINUX
1.1 虚拟机
什么是虚拟机?
借助虚拟化技术,我们可以在系统中,通过软件:模拟计算机硬件,并给虚拟硬件安装真实的操作系统。这样就可以在电脑中,虚拟出一个出来的完整电脑。

1.2 VMmare Workstation 安装
- 安装步骤跳过

- 检查虚拟网卡(win+R 输入ncpa.cpl)

1.3 vm安装centos7
- 创建新的虚拟机
- 简易安装向导
- 选择安装程序光盘映像
- 设置用户名密码
- 设置虚拟机名称和位置
- 指定磁盘容量大小

- 启动虚拟机


1.4远程连接LINUX
- 操作系统的使用形式
- 图形化界面
- 命令行方式
- FinalShell
我们使用VMware可以得到Linux虚拟机,但是在VMware中操作Linux的命令行页面不太方便,主要是:
内容的复制、粘贴跨越VMware不方便
文件的上传、下载跨越VMware不方便
也就是和Linux系统的各类交互,跨越VMware不方便
我们可以通过第三方软件,FinalShell, 远程连接到Linux操作系统之上。
- 安装finalshell(步骤省略)

- FinalShell连接Linux
- 虚拟机命令行输入ifconfig找到IP地址:

- finalshell中输入ip、用户名和密码连接linux

1.5 WSL(Windows Subsystem for Linux)
- 为什么使用wsl?
WSL作为Windows10系统带来的全新特性,正在逐步颠覆开发人员既有的选择。
- 传统方式获取Linux操作系统环境,是安装完整的虚拟机,如VMware.
- 使用WSL,可以以非常轻量化的方式,得到Linux系统环境
目前,开发者正在逐步抛弃以虚拟机的形式获取Linux系统环境,而在逐步拥抱WSL环境。
所以,为什么要用WSL,其实很简单:
- 开发人员都在用,大家都用的,我们也要学习
- 实在是太方便了,简单、好用、轻量化、省内存
- 什么是wsl
WSL: Windows Subsystem for Linux,是用于Windows系统之上的Linux子系统。
作用很简单,可以在Windows系统 中获得Linux系统环境,并完全直连计算机硬件,无需通过虚拟机虚拟硬件
- wsl部署
控制面板==》程序==》程序和功能==》启用和关闭windows功能

微软商店下载Ubuntu,安装完成设置用户名和密码:

安装windows Terminal:

1.6 虚拟机快照
VMware,虚拟机( Workstation和Funsion)支持为虛拟机制作快照。
通过快照将当前虚拟机的状态保存下来,在以后可以通过快照恢复虚拟机到保存的状态。
相当于游戏存档
- 在VMware Workstation PRO 中制作并还原快照

还原快照:

第二章 Linux基础命令
2.1 Linux目录结构
Linux的目录结构是一个树型结构
Windows系统可以拥有多个盘符,如C盘、D盘、E盘
Linux没有盘符这个概念,只有一个根目录/所有文件都在它下面.

Linux路径描述方式
- 在Linux系统中,路径之间的层级关系,使用
/来表示 - 在Windows系统中,路径之间的层级关系,使用:
\来表示
2.2 Linux命令入门
2.2.1linux命令基础
命令行:即Linux终端(Terminal),是一种命令提示符页面。以纯“字符”的形式操作系统,可以使用各种字符化命
令对系统发出操作指令。命令:即Linux程序。一个命令就是一一个Linux的程序。命令没有图形化页面,可以在命令行(终端中)提供字符化的反馈。
Linux命令通用格式:command [-options] [parameter]
command:命令本身
options:[可选] 命令的一些选项,可以通过选项控制命令的行为细节
parameter:[可选] 命令的参数,多用于命令的指向目标等
ls命令入门
ls命令语法细节:
ls [-a -l -h] Linux路径
- -a -l -h是可选的选项
- Linux路径 是此命令可选的参数
当不使用选项和参数,直接使用ls命令本体,表示:以平铺形式,列出当前工作目录下的内容

- ls命令的参数和选项
-a: all的意思,即列出全部文件(包含隐藏文件、文件夹)

图中以.开头的,表示Linux系统的隐藏文件/文件夹(只要以.开头,就能自动隐藏)
-l:表示以列表(竖向排列)的形式展示内容,并展示更多信息

选项可以组合使用,如:
- ls -l -a
- ls -la
- ls -al
上述三种写法,表示同时应用-l 和 -a 的功能
除了选项本身可以组合使用以外,选项和参数也可以一起使用,如:
- ls -al /
以上命令表示以列表形式展示根目录下全部文件
-h:表示以易于阅读的形式展示且必须和-l一起使用

上图可以看出文件大小不只有数值,还带上了单位
2.2.2目录切换相关命令(cd/pwd)
cd命令
当Linux终端(命令行)打开的时候,会默认以用户的HOME目录作为当前的工作目录
我们可以通过cd命令,更改当前所在的工作目录。
cd命令来自英文: Change Directory
语法: cd [linux路径]
- cd命令无需选项,只有参数,表示要切换到哪个目录下
- cd命令直接执行,不写参数,表示回到用户的HOME目录

pwd命令
通过ls来验证当前的工作目录,其实是不恰当的。
我们可以通过pwd命令,来查看当前所在的工作目录。
pwd命令来自: Print Work Directory
语法:pwd
- pwd命令,无参数,无选项

2.2.3 绝对路径、相对路径和特殊路径符
绝对路径:以根目录为起点,描述路径的一种写法,路径描述以
/开头cd /home/weisiyang/Desktop

相对路径:以当前目录为起点,描述路径的一种写法,无需以
/开头cd Desktop

- 特殊路径符
.:表示当前目录,比如cd ./Desktop 表示切换到当前目录下的Desktop目录内,和cd Desktop效果一致..: 表示上一级目录,比如:cd .. 即可切换到上一级目录,cd ../.. 切换到上二级的目录~:表示HOME目录,比如:cd ~ 即可切换到HOME目录或cd ~/Desktop,切换到HOME内的Desktop目录
2.2.4 mkdir命令
通过mkdir命令可以创建新的目录(文件夹)
mkdir来自英文: Make Directory
语法: mkdir [-p] linux路径
- 参数必填,表示Linux路径,即要创建的文件夹的路径,相对路径或绝对路径均可
- -p选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录

-p选项的使用:

2.2.5 文件操作命令
touch命令
可以通过touch命令创建文件
语法:touch linux路径
touch命令无选项,参数必填,表示要创建的文件路径,相对、绝对、特殊路径符均可以使用

cat命令
cat命令用于查看文件内容
语法:cat linux路径
cat同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用

more命令
more命令同样是用来查看文件内容的,但与cat不同的是
- cat是直接将内容全部显示出来
- more支持翻页,如果文件内容过多,可以一页页的展示
语法:more linux路径
同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用
linux系统内置有一个文件,路径为:/etc/services,可以通过more命令查看
- 查看过程中,空格翻页
- q键退出

cp命令
cp命令可以使用于复制文件、文件夹,cp命令来自英文单词copy
语法:cp [-r] 参数1 参数2
- -r选项,可选,用于复制文件夹使用,表示递归
- 参数1,Linux路径,表示被复制的文件或文件夹
- 参数2,Linux路径,表示要复制去的地方

mv命令
mv命令可以用于移动文件\文件夹,mv命令来自英文单词: move
语法:mv 参数1 参数2
- 参数1, Linux路径,表示被移动的文件或文件夹
- 参数2, Linux路径,表示要移动去的地方,如果目标不存在,则进行改名,确保目标存在

rm命令
rm命令可用于删除文件、文件夹
rm命令来自英文单词: remove
语法:rm [-r -f] 参数1 参数2 … 参数n
同cp命令-样, -r选项用于删除文件夹
-f表示force,强制删除(不会弹出提示确认信息)
- 普通用户删除内容不会弹出提示,只有root管理员用户删除内容会有提示
- 所以一-般普通用户用不到-f选项
参数1、参数2、…… 参数N表参数1、参数2….参数:要删除的文件或文件夹路径,按照空格隔开

rm命令支持通配符*,用来模糊匹配
- 符号*表示通配符,即匹配任意内容(包含空),示例:
- test*, 表示匹配任何以test开头的内容
- *test,表示匹配任何以test结尾的内容
- *test*, 表示匹配任何包含test的内容

which命令
我们在前面学习的Linux命令,其实它们的本体就是一个个的二进制可执行程序。
和Windows系统中的.exe文件,是一个意思。
我们可以通过which命令,查看所使用的- -系列命令的程序文件存放在哪里
语法:which 要查找的命令

find命令
在Linux系统中,我们可以通过find命令去搜索指定的文件。
语法:find 起始路径 -name 被查找文件名
-iname 不区分大小写
-type 指定类型:d (目录) f(文件) l(软链接)
-mtime days:按修改时间查找,+days表示指定天数后,-days指定天数前
-ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)
-atime n:查找在 n*24 小时内被访问过的文件。
为了确保后续演示,拥有最大的权限,可以在整个系统完成搜索
我们可以切换到root用户以获得管理员权限
执行命令:
su-root输入密码

配合逻辑符使用
-or 或逻辑
-and 与逻辑
-not 非逻辑
使用-exec参数
1 | find -name "*.txt" -exec rm {} \; |
语法: find 起始路径 -size +|-n[kMG]
- +、-表示大于和小于
- n表示大小数字
- kMG表示大小单位,k(小写字母)表示kb, M表示MB, G表示GB .

grep命令
可以通过grep命令,从文件中通过关键字过滤文件行。
语法:grep [-n -i -v] 关键字 文件路径
- 选项-n,可选,表示在结果中显示匹配的行的行号。
- i :忽略大小写
- v:反向过滤
- 参数,关键字,必填,表示过滤的关键字,带有空格或其它特殊符号,建议使用 ” ” 将关键字包围起来
- 参数,文件路径,必填,表示要过滤内容的文件路径,可作为内容输入端口
先创建一个weisiyang.txt,输入内容用于测试:

测试:

目录递归搜索:
- 递归搜源码函数定义:
1
grep -r "function" /project/src
- JS文件找console.log:查找空行:
1
grep -r --include="*.js" "console.log" 文件目录(空默认当前目录)
查找IP地址:1
grep -n -c "^$" /etc/my.cnf
查找并高亮:1
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log
过滤不含注释行:1
grep --color=auto "WARNING" system.log
1
grep -v "^#" /etc/test.log #不显示#开头的行
wc命令
可以通过wc命令统计文件的行数、单词数量等
语法:wc [-c -m -l -w] 文件路径
- 选项,-c, 统计bytes数量
- 选项,-m,统计字符数量
- 选项,-l, 统计行数
- 选项,-W,统计单词数量
- 参数,文件路径,被统计的文件,可作为内容输入端口
不带参数选项,默认显示行数、单词数、byte数和文件名:

带参数选项:

管道符
符号:|
含义:将管道左边命令的结果,作为右边命令的输入

如上图:
- cat itheima.txt的输出结果(文件内容)
- 作为右边grep命令的输入(被过滤文件)
嵌套使用:

echo命令
echo命令可以在命令行内输出指定内容
语法: echo 输出内容
- 无需选项,只有一个参数表示要输出的内容

反引号 `
反引号(通常也称作飘号)与echo命令搭配可以将包裹的内容作为命令进行执行,而非普通字符
未使用反引号:

使用反引号:
注意:是`而不是‘。
重定向符
>:将左侧命令的结果,覆盖写入到符号右侧指定的文件中>>:将左侧命令的结果,追加写入到符号右侧指定的文件中

tail命令
使用tail命令,可以查看文件尾部内容,跟踪文件的最新更改
语法:tail [-f -num] linux路径
- 参数,Linux路径,表示被跟踪的文件路径
- 选项,-f,表示持续跟踪(follow)
- 选项, -num(整数不是单词),表示,查看尾部多少行,不填默认10行

-f参数选项持续跟踪文件尾部内容的更改:

sed命令
- 基础和特性
sed工作原理:- 逐行处理文本:sed读取一行到模式空间,执行命令后输出
- 流水线式编辑:像流水线一样对文本进行连续处理
- 不直接修改原文:默认输出处理结果,不改变原文件内容
特性:支持正则表达式,可多操作组合,默认不修改原文件
动作:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)(2a即第二行后插入)
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)(2i即第2行前插入);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
- 替换操作
1 | sed 's/旧词/新词/' 文件名 #替换每行第一个匹配项 |
以行为单位的新增/删除
1
2
3
4nl testfile | sed '2,5d'#删除2-5行,表示删除
nl testfile | sed '2i drink tea'#第二行插入drink tea
nl testfile | sed '2a Drink tea or ......\
drink beer ?'#第二行新增两行文本,\表示换行引用匹配内容
1
2
3
4
5
6引用&或\1引用匹配内容
[0-9]+表示所有数字 [&] 表示将匹配到的字符加上[],&为匹配到的字符
echo "123" abc "456" | sed 's/[0-9]\+/[&]/g'
将yyyy-mm-dd(1-2-3) 改为mm-dd-yy(3-2-1)格式 旧字符:([0-9]{4})-([0-9]{2})-([0-9]{2}) 新字符:\3/-\2/-\1 其中/-为-转义字符
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3/-\2/-\1/'搜寻并执行命令
1
2nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'
搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo*替换为 kk,再输出这行,最后的q是退出。追加内容(a:行后添加 i:行前追加)
1
2
3
4sed '/pattern/a \new line' file #在指定行后追加(可使用\换行,以多行追加)
sed '$a \new line' file #在文件末尾添加
sed '/pattern/i \new line' file
sed 'pattern/i\\' file #插入空行多条件处理
-e 参数:- -e <脚本>或–expression=<脚本> 以选项中指定的script来处理输入的文本文件1
sed -e 's/apple/苹果/g' -e 's/banana/香蕉/g' -e 's/car/车/g'#同时替换多个条件行
2.3 vi/vim编辑器
vi\vim是visual interface的简称,是Linux中最经典的文本编辑器
同图形化界面中的文本编辑器一样, vi是命令行下对文本文件进行编辑的绝佳选择。
vim是vi的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell程序编辑的功能,可以不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性。
2.3.1 vi/vim三种工作方式
命令方式(command mode)
命令模式下,所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能。
此模式下,不能自由进行文本编辑。输入模式(insert mode)
也就是所谓的编辑模式、插入模式。
此模式下,可以对文件内容进行自由编辑。底线命令模式(last line mode)
以:开始,通常用于文件的保存、退出。

2.3.2 命令模式
- 终端命令行进入命令模式:
语法: vi /vim linux路径
- 如果文件路径表示的文件不存在,那么此命令会用于编辑新文件
- 如果文件路径表示的文件存在,那么此命令用于编辑已有文件
- 命令模式下有一般指令
移动光标:
| 命令 | 含义 |
|---|---|
| gg | 光标移动到文档头部 |
| G | 光标移动到文档尾部 |
| ngg | 光标移动到第n行头部 |
| n+ | 光标向下移动n行 |
| n- | 光标向上移动n行 |
| 0 | 光标移动到当前行行首 |
| $ | 光标移动到当前行行尾 |
| w | 光标移动到下一个字的开头 |
| b | 光标移动到上一个字的开头 |
| fx | 光标移动到当前行下一个字母x的位置 |
| h | 光标向左移动一个字符。等于方向键← |
| j | 光标向下移动一个字符。等于方向键↓ |
| k | 光标向上移动一个字符。等于方向键↑ |
| l | 光标向右移动一个字符。等于方向键→ |
复制粘贴:
| 命令 | 含义 |
|---|---|
| yy | 复制当前行 |
| nyy | 复制当前行以及下面的n-1行 |
| p | 粘贴 |
删除:
| 命令 | 含义 |
|---|---|
| x | 删除光标后一个字符 |
| X | 删除光标前一个字符 |
| nx | 删除光标后n个字符 |
| nX | 删除光标前n个字符 |
| d0 | 从光标处删除到行首(delete) |
| d$ | 从光标处删除到行尾 |
| dG | 从光标当前行开始,向下全部删除 |
| dgg | 从光标当前行开始,向上全部删除 |
| dd | 删除光标所在行 |
| ndd | 删除光标所在行以及后面n-1行 |
撤销:
| 命令 | 含义 |
|---|---|
| u | 撤销上一步操作 |
- 命令模式进入编辑模式:
| 命令 | 含义 |
|---|---|
| i | 光标前插入 |
| a | 光标后插入 |
| I | 光标当前行头部插入 |
| A | 光标当前行结尾插入 |
| o | 光标下一行插入 |
| O | 光标上一行插入 |
2.3.3 底线命令模式
搜索查找:
| 命令 | 模式 |
|---|---|
| / | 进入搜索模式 |
| /str | 从光标处向文件尾部搜索,查找str字符串 |
| ?str | 从光标处向文件首部搜索,查找str字符串 |
| n | 向下继续搜索(next) |
| N | 向上继续搜索 |
替换:
| 命令 | 含义 |
|---|---|
| :s/str1/str2/g | 将当前行中所有str1,均用str2替换 |
| :s/str1/str2/gc | 将当前行中所有str1,均用str2替换,需要确认 |
| :%s/str1/str2/g | 将文件中所有str1,均用str2替换 |
| :%s/str1/str2/gc | 将文件中所有str1,均用str2替换,需要确认 |
退出和其他:
| 命令 | 含义 |
|---|---|
| :q | 退出(quit) |
| :q! | 强制退出 |
| :wq | 保存文件并退出 |
| :w | 将更改内容写入文件 |
| :set nu | 显示行号 |
| :set paste | 设置粘贴模式 |
第三章 Linux用户和权限
3.1认知root用户
无论是Windows. MacOS、Linux均采用多用户的管理模式进行权限管理。
在Linux系统中,拥有最大权限的账户名为:root(超级管理员)
而在前期,我们一直使用的账户是普通的用户: weisiyang
su命令和exit命令
su命令就是用于账户切换的系统命令,其来源英文单词: Switch User
语法:su [-] [用户名]
- - 符号是可选的,表示是否在切换用户后加载环境变量
- 参数:用户名,表示要切换的用户,用户名也可以省略,省略表示切换到root
- 切换用户后,可以通过exit命令退回上一个用户,也可以使用快捷键:ctrl + d
sudo命令
我们可以使用sudo命令,为普通的命令授权,临时以root身份执行。
语法:sudo 其他命令
- 在其它命令之前,带上sudo,即可为这一条命令临时赋予root授权
- 但是并不是所有的用户,都有权利使用sudo,我们需要为普通用户配置sudo认证
为普通用户配置sudo认证
切换到root用户,执行visudo命令,会自动通过vi编辑器打开: /etc/sudoers
在文件末尾添加:
用户名 ALL=(ALL) ALL
用户名 ALL=(ALL) NOPASSWD :ALL
- :wq保存
3.2 用户、用户组管理
- 用户、用户组
Linux系统中:
- 可以配置多个用户
- 可以配置多个用户组
- 用户可以加入多个用户组中
Linux中关于权限的管控级别有2个级别,分别是:
- 针对用户的权限控制
- 针对用户组的权限控制
用户组管理
1.创建用户组
语法: groupadd 用户组名
2.删除用户组
语法:groupdel 用户组名
用户管理
1.创建用户
语法:useradd [-g -d] 用户名
- 选项: -g指定用户的组,不指定-g, 会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g
- 选项: -d指定用户HOME路径, 不指定,HOME目录默认在: /home/用户名


2.删除用户
语法:userdel [-r] 用户名
选项: -r, 删除用户的HOME目录,不使用-r,删除用户时,HOME目录保留

3.查看用户所属组
语法:id [用户名]
参数:用户名,被查看的用户,如果不提供则查看自身


4.修改用户所属组
语法:usermod -aG 用户组 用户名
将指定用户加入指定用户组

5.修改用户密码
语法 passwd [-l -u -e] [username]
-l :lock 锁定账户
-u :ulock 解锁账户
-e :强制下次用户登录时修改密码
usename :要修改的用户
6.设置用户密码过期时间
语法:chage [-l -E ] [date] [username]
-l :查看最近账户改密情况
-E :账户过期时间
date:过期时间
- getent命令
gentent命令可以查看当前系统中有哪些用户
语法:getent passwd

上图中:密码(x):用户id:组id:描述信息:HOME目录:执行终端(默认bash)
gentent也可以查看系统中的用户组
语法:getent group

上图中:组名称:组认证(显示为x):组id
3.3查看权限控制
- 认知权限信息

第一列:表示文件、文件夹的权限控制信息
第三列:表示文件、文件夹所属用户
第四列:表示文件、文件夹所属用户组

权限细节分为10位:
第1位:
-或d或l:分别表示文件、文件夹、软链接第2-4位(用户权限):
r或-,w或-,x或-第5-7位(用户组权限):
r或-,w或-,x或-第8-10位(其他用户权限):
r或-,w或-,x或-

3.4修改权限控制
chmod命令
只有文件、文件夹的所属用户或root用户可以修改。
语法:chmod [-R] u=权限,g=权限,o=权限 文件或文件夹
选项:-R,对文件夹内的全部内容应用同样的操作

权限的数字序列
权限可以用3位数字来代表,第一位数字表示用户权限,第二位表示用户组权限,第三位表示其它用户权限。
| 数字 | 含义 | 原表示 |
|---|---|---|
| 0 (000) | 无权限 | — |
| 1 (001) | 有x权限 | –x |
| 2 (010) | 有w权限 | -w- |
| 3 (011) | 有w和x权限 | -wx |
| 4 (100) | 有r权限 | r– |
| 5 (101) | 有r和x权限 | r-x |
| 6 (110) | 有r和w权限 | rw- |
| 7 (111) | 有全部权限 | rwx |
chown命令
使用chown命令,可以修改文件、文件夹的所属用户和用户组,需要root权限
语法:chown [-R] [用户] [:] [用户组] 文件或文件夹
- 选项, -R,同chmod,对文件夹内全部内容应用相同规则
- 选项,用户,修改所属用户
- 选项,用户组,修改所属用户组
:用于分隔用户和用户组

第四章 linux实用操作
4.1快捷键
ctrl + c 强制停止
强制停止某些程序的运行
命令输入错误,退出当前输入
ctrl + d 退出或登出
退出账户的登录
退出某些程序的专属页面
历史命令搜索
1.history:
可以通过history命令查看历史输入过的命令

!+命令部分前缀:
可以自动匹配符合前缀的最近执行过的命令

3.ctrl + r ,输入内容:
使用输入的内容去匹配历史命令
- 回车键可以直接执行
- 键盘左右键,可以得到此命令(不执行)

- 光标移动
| 快捷键 | 含义 |
|---|---|
ctrl+a |
光标移动到开头 |
ctrl+e |
光标移动到结尾 |
ctrl+← |
向左移动一个单词 |
ctrl+→ |
向右移动一个单词 |
- 清屏
1.快捷键ctrl+l
2.命令clear
4.2软件安装
操作系统的两种安装软件的方法:
1.通过下载安装包自行安装
2.系统的应用商店安装
- yum软件安装(for centos)
yum: RPM包软件管理器,用于自动化安装配置Linux软件,并可以自动解决依赖问题。
语法:yum [-y] [install | remove | search] 软件名称
- 选项:-y,自动确认,无需手动确认安装或卸载过程
- install:安装
- remove:卸载
- search:搜索
安装:

卸载:

查找:

- apt软件安装(for ubuntu)
ubuntu系统软件安装包为.deb文件,使用apt进行包管理
语法:apt [-y] [install | remove | search] 软件名称
安装:

4.3 systemctl命令
Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启.
能够被systemctl管理的软件,一般也称之为:服务
语法:systemctl start | stop | status | enable | disable 服务名
- start:启动
- stop:停止
- status:状态查看
- enable:开启开机自启动
- disable:关闭开机自启动
系统内置服务,如:
- NetworkManager,主网络服务
- network,副网络服务
- firewalld,防火墙服务
- sshd, ssh服务( FinalShell远程登录Linux使用的就是这个服务)

4.4软链接
在系统中创建软链接,可以将文件、文件夹链接到其它位置。
类似Windows系统中的快捷方式.
语法:ln -s 参数1 参数2
- -s选项,创建软连接
- 参数1:被链接的文件或文件夹
- 参数2:要链接去的目的地

4.5日期、时区
- date命令
通过date命令可以在命令行中查看系统的时间
语法:date [-d] [+格式化字符串]
- -d按照给定的字符串显示日期, -般用于日期计算
- 格式化字符串:通过特定的字符串标记,来控制显示的日期格式
%Y年%y年份后两位数字(00….99)%m月 份(01….12)%d日 (01…..31)%H小时(00…..23)%M分钟(00……59)%S秒(00…..60)%s自1970-01-01 00000UTC到现在的秒数

-d选项的使用:
时间标记:
- year
- month
- day
- hour
- minute
- second

- 修改Linux时区
1.删除etc/localtime
2.创建新的软链接,将/usr/zoneinfo/Asia/Shanghai软链接到/etc/localtime

- ntp程序
ntp程序可以自动校准时间
安装程序并设置开机自启动即可
手动校准:
语法:ntpdate -u ntp服务器

- chrony程序
Chrony是一个用来同步计算机系统时钟的网络时间协议(NTP)客户端和服务器。它适用于各种网络环境,尤其是在时钟精度要求较高且网络连接不稳定的情况下。
- chronyd:这是一个后台守护进程,负责时间同步任务。
- chronyc:这是一个命令行界面工具,用户可以通过它与
chronyd通信,监控和配置时间同步。
语法:chronyc tracking
查看chrony服务器状态
语法:chronyc sources
查看同步用的ntp时间服务器

4.6IP地址、主机名
- 查看本机IP地址
IP地址:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异
语法:ifconfig或ipconfig

- 主机名
每一台电脑除了对外联络地址(IP地址)以外,也可以有一-个名字,称之为主机名
无论是Windows或Linux系统,都可以给系统设置主机名
- 查看主机名
语法:hostname

- 修改主机名
语法:hostnamectl set-hostname 主机名 新主机名

- 虚拟机配置固定IP地址
1.vmware中配置IP地址和网段
编辑==>虚拟网路编辑器==>更改设置==>选择vmnet8并修改IP地址和网段==>nat设置==>设置网关==>确定应用



2.Linux中修改固定IP
使用vim编辑etc/sysconfig/network-scripts/ifcfg-ens33
编辑结果如下:

然后使用systemctl restart network重启网络,修改ssh连接配置并连接:


- 纯命令行:
1
2
3
4
5nmcli connect mod ens33 ipv4.address 192.168.16.100/24
nmcli connect mod ens33 ipv4.gateway 192.168.16.1
nmcli connect mod ens33 ipv4.dns 223.5.5.5
nmcli connect mod ens33 ipv4.method manual
nmcli connect down ens33 && nmcil connect up ens33
4.7网络传输
- ping命令
可以通过ping命令,检查指定的网络服务器是否是可联通状态
语法:ping [-c num] ip或主机名
- 选项: -C,检查的次数,不使用-C选项,将无限次数持续检查
- 参数:ip或主机名,被检查的服务器的ip地址或主机名地址

- wget命令
wget是非交互式的文件下载器,可以在命令行内下载网络文件
语法:wget [-b] url
- 选项:-b,可选,(backend)后台下载,会将日志写入
- 当前工作目录的wget-log文件
参数:url,’下载链接
- curl命令
curl可以发送http网络请求,可用于:下载文件、获取信息等
语法:curl [-O] url
- 选项:-O,用于下载文件,当url是下载链接时,可以使用此选项保存文件
- 参数:url,要发起请求的网络地址

- 端口
端口,是设备与外界通讯交流的出入口。端口可以分为:物理端口和虛拟端口两类
- 物理端口:又可称之为接口,是可见的端口,如USB接口, RJ45网口, HDMI端口
- 虚拟端口:是指计算机内部的端口,是不可见的,是用来操作系统和外部进行交互使用的
查看端口占用
- 查看IP的端口占用
使用yum安装nmap
命令: nmap 被查看的ip

- 查看指定端口占用
安装net-tools
命令:netstat -anp | grep 端口号

4.8进程管理
- 进程
程序运行在操作系统中,是被操作系统所管理的。.
为管理运行的程序,每一个程序在运行的时候,便被操作系统注册为系统中的一个:进程
并会为每一个进程都分配一一个独有的:进程ID (进程号)
进程状态:
1.运行态 Running
2.睡眠态 Sleeping
3.僵尸态 Zombiz
4.停止态 Stopped查看进程
可以通过ps命令查看Linux系统中的进程信息
语法:ps [-e -f]
- 选项: -e,显示出全部的进程
- 选项: -f,以完全格式化的形式展示信息(展示全部信息)
一般来说,固定用法就是: ps -ef列出全部进程的全部信息

- UID:进程所属的用户ID
- PID:进程的进程号ID
- PPID:进程的父ID(启动此进程的其它进程)
- C:此进程的CPU占用率(百分比)
- STIME:进程的启动时间
- TTY:启动此进程的终端序号,如显示?,表示非终端启动
- TIME:进程占用CPU时间
- CMD:进程对应的名称或启动路径或启动命令
- 管道符过滤查看指定进程
语法: ps [-e -f] | grep 指定进程或名称

- 查找进程pid
语法:pgrep [进程名称]
根据进程名称查找pid号
- 树状显示进程
语法:pstree [进程名称]
树状显示进程
- 不挂起守护进程
语法:nohup Command [ Arg … ] [&]
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
- 关闭进程
语法:kill [-9] 进程id
选项: -9,表示强制关闭进程。不使用此选项会向进程发送信号要求其关闭,但是否关闭看进程自身的处理机制。

4.9 主机状态
- 查看系统资源占用
可以通过top命令查看CPU、内存使用情况,类似Windows的任务管理器
默认每5秒刷新一次,
语法:top [-p | -d | -c | -n | -b | -i | -u]
- -p只显示某个进程的信息
- -d 设置刷新时间,默认是5s
- -c显示产生进程的完整命令,默认是进程名
- -n 指定刷新次数,比如top -n 3,刷新输出3次后退出
- -b 以非交互非全屏模式运行,以批次的方式执行top,一般配合-n指定输出几次统计信息,将输出重定向到指
定文件,比如top -b -n 3 > /tmp/top. tmp- -i不显示任何闲置 (idle) 或无用(zombie) 的进程
- -u查找特定用户 启动的进程
按q 或 ctrl+ c退出

上图详解:
第一行:top:命令名称,22:00:45:当前系统时间,up 10:06:启动了10小时6分钟,2 user:2个用户登录,load :1、5、15分钟负载
第二行:Tasks:168个进程,1 runnning:一个进程在运行,167 sleeping:167个进程休眠,0个停止进程,0个僵尸进程
第三行:*%Cpu(s):cpu使用率,us*:用户cpu使用率,sy:系统cpu使用率,ni:高优先级进程占用cpu时间百分比,id:空闲cpu率,wa:IO等待cpu占用率,hi:cpu硬件中断率,si:cpu软件中断率,st:强制等待占用cpu率
第四、五行:
KiB Mem:物理内存,KiB Swap:虚拟内存(交换空间)
- PID:进程id
- USER:进程所属用户
- PR:进程优先级,越小越高
- NI:负值表示高优先级,正表示低优先级
- VIRT:进程使用虚拟内存,单位KB
- RES:进程使用物理内存,单位KB
- SHR:进程使用共享内存,单位KB
- S:进程状态(S休眠, R运行, Z僵死状态,N负数优先级, 1空闲状态)
- %CPU:进程占用CPU率
- %MEM:进程占用内存率.
- TIME+:进程使用CPU时间总计,单位10毫秒
- COMMAND:进程的命令或名称或程序文件路径
top交互式选项
| 按键 | 功能 |
|---|---|
| h | 显示帮助信息 |
| c | 显示产生进程完整命令 |
| f | 选择需要展示的信息列 |
| M | 根据驻留内存(RES)大小排序 |
| P | 根据CPU使用百分比大小排序 |
| T | 根据时间/累计时间进行排序 |
| E | 切换顶部内存显示单位 |
| e | 切换进程内存显示单位 |
| l | 切换显示平均负载和启动时间信息 |
| i | 不显示闲置或无用进程 |
| t | 切换显示CPU状态信息 |
| m | 切换显示内存信息 |
- 磁盘信息监控
1.df命令查看硬盘的使用情况
语法: df [-h]
选项: -h,以更加人性化的单位显示

2.iostat命令查看CPU、磁盘的相关信息
语法:iostat [-x] [num1] [num2]
-x:显示更多信息
num1:刷新间隔
num2:刷新次数

- 网络状态监控
可以使用sar命令查看网络的相关统计
语法:sar -n DEV num1 num2
-n:查看网络
DEV:查看网络接口
num1:刷新间隔
num2:刷新次数

IFACE:本地网卡接口的名称出
rxpck/s:每秒钟接受的数据包
txpck/s:每秒钟发送的数据包
rxKB/S:每秒钟接受的数据包大小,单位为KB
txKB/S:每秒钟发送的数据包大小,单位为KB
rxcmp/s:每秒钟接受的压缩数据包
txcmp/s:每秒钟发送的压缩包
rxmcst/s:每秒钟接收的多播数据包
4.10环境变量
环境变量是操作系统(Windows.Linux、Mac)在运行的时候,记录的-些关键性信息,用以辅助系统运行。
在Linux系统中执行:env命令即可查看当前系统中记录的环境变量

- 环境变量PATH

PATH记录了系统执行任何命令的搜索路径
上图记录了,执行命令时会在目录中搜索程序本体
/usr/local/bin
/usr/bin:/usr/local/sbin
/usr/sbin
/home/weisiyang/.local/bin
/home/weisiyang/bin
- $ 符号
在Linux系统中,$符号被用于取”变量”的值。
如: echo $PATH

- 自行设置环境变量
- 临时设置
语法:export key (变量名)= value(变量值)

- 永久生效的变量
- 当前用户环境变量:~/.bashrc文件中配置
- 所有用户环境变量:/etc/profile文件中配置
配置完后使用source 配置文件,使变量生效,或者重启ssh连接工具
当前用户变量配置:


所有用户变量配置:

- 自定义环境变量PATH
1.创建测试文件

2.添加环境变量
临时修改PATH:
语法:export PATH=$PATH:要添加的路径
永久生效:
在用户环境变量文件(~/.bashrc)中或系统环境变量中(/etc/profile)追加
export PATH=$PATH:要添加的路径

4.11上传和下载
1.图形化窗口
- finallshell使用底部文件窗口上传和下载
- xshell可以使用同系列程序xftp进行上传和下载
2.rz、sz命令
rz、sz命令需要安装,可以通过: yum -y install lrzsz,即可安装。
上传:输入rz,会自动打开一个文件窗口,选择文件即可上传
下载:输入sz 要下的文件,finalshell会自动下载到桌面的/fsdownload中,xshell则是先选择要下载到的文件在开始下载
4.12压缩、解压
- tar命令
Linux和Mac系统常用有2种压缩格式,后缀名分别是:
tar, 称之为tarball,归档文件,即简单的将文件组装到一 个.tar的文件内,并没有太多文件体积的减少,仅仅是简单
的封装gz,也常见为.tar.gz, gzip格式压缩文件,即使用gzip压缩算法将文件压缩到- 一个文件内,可以极大的减少压缩后的
语法:tar [-c -v -x -f -z -C] 参数1….参数n
- -c,创建压缩文件,用于压缩模式
- -v,显示压缩、解压过程,用于查看进度
- -x,解压模式
- -f,要创建的文件,或要解压的文件, -f选项必须在所有选项中位置处于最后一个
- -z, gzip模式,不使用-z就是普通的tarball格式,一般位于选项第一个
- -C,选择解压的目的地,用于解压模式
压缩:

解压:

指定目的地解压:

- zip压缩命令
语法:zip [-r] parm1 … parm2
-r ,递归压缩整个文件夹,与rm,cp命令效果一致

- unzip解压命令
语法unzip [-d] parm1 parm2
- -d ,表示要指定解压目录,不指定默认是当前目录
- parm1 ,被解压目录
- parm2 :被解压的文件

4.13磁盘管理与分区
磁盘与分区的概念
- 磁盘的物理结构:磁盘由盘片、磁头主轴马达等组成,数据以磁性形式存储在盘片上。
- 分区的逻辑划分:分区是将磁盘划分为多个逻辑部分,每个分区可以独立格式化和使用。
- 文件系统的作用:文件系统定义了数据存储的结构和管理方式,如ext4、XFS。
- 分区表的类型:常见的分区表类型有MBR和GPT,它们决定了磁盘的分区的布局和限制。
Linux中磁盘的命名
1.基于设备类型命名
Linux中,磁盘设备通常以/dev/sd[a-z]或者/dev/hd[a-z]的形式命名,如sda表示的一个SCSI磁盘
2.基于分区编号命名
每个磁盘设备可以有多个分区,他们通过在设备名后加数字编号来区分,例如sda1是sda磁盘的第一个分区。分区的类型
- 主分区:主分区是硬盘上独立的,直接被操作系统识别的分区,每个硬盘最多可有4个主分区
- 扩展分区:扩展分区用于创建额外的逻辑分区,它本身不用于存储数据,而是作为逻辑分区的容器。
- 逻辑分区:逻辑分区是在扩展分区内部创建的,用于进一步划分扩展分区的空间,以满足不同的存储需求。
df命令
Linux df(英文全拼:display free disk space) 命令用于用于显示文件系统的磁盘空间使用情况,包括总容量、已用空间、可用空间和挂载点等信息。
语法:df [-h ] [FIlE]
-h (human readable) 以易读形式显示
- du命令
Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。
du 会显示指定的目录或文件所占用的磁盘空间。
语法: du [-s -h -S ] [文件]
-s或–summarize 仅显示指定目录或文件的总大小,而不显示其子目录的大小。
-S或–separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
- -h或–human-readable 以K,M,G为单位,提高信息的可读性。
lsblk命令
lsblk(list block)是 Linux 系统中的一个实用命令,用于列出系统中所有可用的块设备信息。块设备是指以块为单位进行数据读写的存储设备,如硬盘、SSD、U盘等。iostat命令
iostat(Input/Output Statistics)是Linux系统下一个强大的性能监控工具,属于sysstat工具包的一部分。它主要用于监控系统的磁盘I/O活动情况和CPU使用情况。分区操作
1.选择分区类型
在创建新分区时,首先要确定是创建主分区还是扩展分区,以及是否使用逻辑分区。
2.分区大小规划
根据实际需求规划分区大小,合理分配空间,避免资源浪费或不足
3.选择合适的文件系统进行格式化,如ext4、XFS等,确保分区能够被系统正确识别和使用。
使用lsblk查看分区结果
格式化分区(创建分区后)
mkfs命令:
Linux mkfs(英文全拼:make file system)命令用于在特定的分区上建立 linux 文件系统。
语法:mkfs [-t] 文件系统 [dev]
- device : 预备检查的硬盘分区,例如:/dev/sda1
-t : 给定档案系统的型式,Linux 的预设值为 ext2

- 挂载分区
1.选择合适的文件系统
在挂载分区前,需要确定分区的文件系统类型,如ext4、xfs
等,以确保兼容性。
2.挂载点的创建
创建一个目录作为挂载点,例如/mnt/data,用于挂载新的
分区。
3.使用mount命令挂载
通过mount命令将分区挂载到之前创建的挂载点,如执行
mount /dev/sdb1 /mnt/data
4.配置开机自动挂载
编辑/etc/fstab文件,添加挂载信息,使系统在启动时自动
挂载分区。
自动挂载:
4.14 Linux内核升级
- 内核的定义与功能
- 内核是电脑的总指挥:负责管理所有硬件和软件之间的配合,确保系统运行流畅。
- 协调硬件和软件工作:例如,玩游戏时协调显卡、键盘、网络等硬件,保证游戏运行不卡顿。
- 、
- 升级内核的必要性
- 支持新硬件:新买的显卡、无线网卡等硬件可能需要新的内核才能被识别
- 修复漏洞:升级内核可以修复系统漏洞,增强安全性,防止黑客攻击
- 提升性能:优化内核工作效率,使电脑运行更快更稳定
- 支持新功能:新的内核可能带来新的网络加速、文件加密的先进功能
- 升级前的准备
- 备份关键文件,避免升级失败风险
使用命令cp -r /boot /boot_backup和cp -r /etc /etc_backup备份环境与内核。 - 更新现有软件
Ubuntu/Debian系:apt update && apt upgrade -y
Centos7:yum update -y
Centos8:dnf update -y
- 内核升级步骤
Ubuntu:apt install linux-image-generic -y
Centos7:由于centos7官方已经不维护,所以不能通过应用商店软件包升级内核,需要手动下载内核软件包进行安装升级。
- 下载内核:内核下载镜像站进行下载相关版本内核
- 安装内核包:rpm -Uvh [内核包路径]
- 查看默认启动顺序:
1
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
- 设置新内核为默认内核:grub2-set-default 0
- 重启即可加载新内核


5. 清理就旧的内核文件
Ubuntu/Debian:apt autoremove --purge
Centos/REHL:package-cleanup --oldkernels --count=1
4.15 linux系统计划任务
- 计划任务定义
- 任务的定义:计划任务是预先设定的,需要在特定时间或条件下自动执行的操作或程序。
- 任务的分类: 计划任务可以分为一次性任务和周期性任务,根据执行频率和时间点进行区分。
- 任务的触发条件:任务触发条件包括时间、事件或系统状态,如特定日期、系统启动或用户登录。
- 任务的执行环境:计划任务通常在操作系统或特定软件中设置,如Windows任务计划程序或Linux的cron。
- 计划任务的作用
- 提升工作效率
- 资源优化配置
- 确保任务按时完成
- cron定时任务(重复闹铃)
cron表达式基础:Cron表达式由六或七个字段组成,用于定义任务执行的时间点和频率。

Cron任务的常见用途:Cron常用于自动化系统维护任务,如备份、清理日志文件等周期性工作。
语法:crontab[-l -e -r]- l :查看cron任务列表
- e:编辑cron定时任务
- r:删除当前cron任务
- At命令(单次闹铃)
- At命令定义:At命令是一种用于安排在特定时间执行一次任务的命令行工具。
- At命令工作原理:通过指定时间参数,At命令将任务添加到队列中,到预定时间由系统自动执行。
- At命令历史背景:At命令起源于Unix系统,后来被多种操作系统采纳,用于简化定时任务的管理。
- At命令使用场景:At命令常用于服务器维护、数据备份等需要定时执行的任务。
语法:at[选项][时间]1
2
3
4
5
6
7pwd | at 11:50 #11:50执行pwd
at 15:30
warning: commands will be executed using /bin/sh
echo "Hello at command" > ~/at_test.txt
# 按 Ctrl+D 结束输入
job 1 at Tue Jul 18 15:30:00 2023 - 查看和删除at任务
1
2
3
4atq # 或 at -l
1 Tue Jul 18 15:30:00 2023 a username
atrm 1 # 或 at -d 1
4.16nfs网络文件系统
- 概述和核心概念
基本定义:
跨平台文件共享协议
采用客户端-服务器架构实现异构系统互通,如Linux与Unix系统间实现无缝文件传输(NASA科研项目采用NFS跨平台协作)核心价值
集中式存储管理优势
通过单一存储节点服务多客户端,降低运维复杂度(某跨国银行采用NFS统一管理全球分支机构数据)
高性能网络传输机制
基于RPC/XDR实现高效数据传输,支持大文件快速读写(皮克斯动画工作室渲染集群采用NFS加速4K视频处理)
标准化网络协议体系
遵循RFC7530标准构建,兼容NFSV4协议与TCP传输(阿里云NAS服务基于NFS协议实现企业级文件存储方案)
- NFS服务端配置
创建共享文件(权限755)
1
mkdir -p /export/share
编辑nfs配置文件
1
vim /etc/exports

配置文件:
1 |
|
文件夹 + 可访问ip +( 权限 )
启动nfs服务
systemctl start nfs-server开放防火墙端口
tcp : 2049端口
udp: 111端口
- nfs客户端配置
创建用于挂载的文件夹
mkdir -p /mnt/nfs挂载服务端的共享文件
临时挂载:mount -t nfs 192.168.16.100:/export/share /mnt/nfs
永久挂载:
编辑fstab配置文件vim /etc/fstab
行末添加:1
服务器ip:/共享文件夹路径 挂载点 nfs defaults 0 0
- 权限管理规范
- 实施用户权限分层机制
采用root/nfsnobody/自定义用户组三级体系,如RedHat系统默认使用nfsnobody用户保障共享安全。 - 启用SELinux强制访问保护
部署SELinux策略限制NFS守护进程权限,防止越权操作,如RHEL系统默认启用nfs_selinux策略。 - 配置ACL扩展权限控制
通过setfacl命令为研发目录添加特定用户写权限,实现跨部门协作时的精准文件访问控制。
第五章 shell编程
5.1 shell概述
- shell定义与功能
- 定义:Shell是用户与Linux操作系统交互的命令行界面负责解释用户输入的命令。
- 核心功能:Shell提供命令行解释、脚本编程、环境配置等功能,是系统管理与自动化任务的关键工具。
- shell种类与选择
- 常见的shell种类:Linux中常见的Shell包括bash、sh、csh、ksh等,各有特点和使用场景
- 选择合适的Shell:根据个人习惯和项目需求选择shell,例如bash因其广泛支持和脚本兼容性二受欢迎。
- shell的性能考量:不同的shell在性能上有所差距,例如zsh在某些情况下提供更快的命令执行速度。
5.2应用场景说明
- 自动化任务处理
- 定时备份数据:使用shell脚本可以设置定时任务,自动备份重要数据,确保数据安全。
- 监控系统状态:shell脚本可以监控服务器的CPU、内存使用情况,并在异常时发送警报。
- 系统管理与监控
- 自动化任务调度:使用Shell脚本可以设置定时任务,如使用cron进行系统维护和数据备份。
- 资源使用情况监控:Shell可以编写脚本来监控CPU、内存和磁盘使用情况,及时发现系统瓶颈
- 日志文件分析:通过Shell脚本分析系统日志,帮助管理员快速定位问题和安全事件。
- 网络服务状态检查:Shell脚本可以定期检查网络服务状态,如HTTP、SSH服务,确保服务的高可用性。
- 软件开发辅助
- 自动化构建与部署:使用Shell脚本自动化软件的构建和部署过程,提高开发效率,减少人为错误。
- 版本控制与代码管理:利用Shell脚本与版本控制系统(如Git)交互,实现代码的自动提交、分支切换等操作。
5.3 Shell基本语法与核心功能
1. 脚本编写规范:
- 命名规范:脚本文件名应简洁明了,使用小写字母和下划线如”backup_script.sh”。
- 注释说明:脚本开头应包含注释说明,包括脚本功能、作者、创建日期及修改记录。
- 代码缩进与格式:使用统一的缩进风格(如空格或制表符),保持代码整洁,易于阅读。
- 注释:脚本应写注释,每一段代码后,都要注释说明这段内容什么含义。
脚本示例:
第一行:定义脚本的解释 器
第二行:注释脚本名称
第三行:解释脚本做了那些操作
第四行:作者
第五行:创建日期
1 | !/bin/bash |
2. 变量
命名规则:
- 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
- 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
- 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
- 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
- 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
- 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
使用变量:使用一个定义过的变量,只要在变量名前面加美元符号即可。
1
2
3your_name=zero
echo $your_name
echo ${your_name}注:花括号可选,花括号便于解释器识别变量边际
只读变量
使用 readonly 命令可以将变量定义为只读变量1
2
3!/bin/bash
myname=zero
readyonly myname删除变量
使用 unset 命令可以删除变量1
2
3!/bin/bash
myname=zero
unset myname变量类型
定义变量时=前后不能有空格,即整条变量语句都不能有空格
| 变量类型 | 说明 |
|---|---|
| 字符串变量 | 在 Shell中,变量通常被视为字符串。你可以使用单引号 ‘ 或双引号 “ 来定义字符串my_string='hello' 或my_string="hello" |
| 整数变量 | 你可以使用 declare 或 typeset 命令来声明整数变量。这样的变量只包含整数值declare my_interger=123 |
| 数组变量 | Shell 也支持数组,允许你在一个变量中存储多个值。数组可以是整数索引数组或关联数组 整数索引数组: my_array=(1 2 3 4 5)关联数组(类似map): declare -A associative_arrayassociative_array["name"]="John"associative_array["age"]=20 |
| 环境变量 | 这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境 PATH 变量包含了操作系统搜索可执行文件的路径: echo $PATH |
| 特殊变量 | 有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称,$1, $2,等表示脚本的参数。$#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。 |
3. 用户输入
使用read 读取用户输入
1 | echo -n "请输入你的内容" |
4. 流程控制
- 条件判断
if :
1 | if 条件 |
写成一行(适用于终端命令提示符 ):
1 | if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi |
if else:
1 | if 条件 |
if else-if else:
1 | if 条件 |
注:
if else 中的[...]判断语句使用-gt表示大于,-lt表示小于
1 | if ["$a" -gt "$b"];then |
如使用((...))作为判断语句,大于和小于可以直接使用<和>
1 | if (( a > b )); then |
if else 语句经常与 test 命令结合使用,如下所示:
1 | num1=$[2*3] |
for循环
一般格式:1
2
3
4
5
6
7for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done写成一行:
1
for var in item1 item2 ... itemN; do command1; command2… done;
示例:
1
2
3
4for var in 1 2 3 4 5
do
echo $var
donewhlie语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。1
2
3
4while 条件
do
命令
done示例:
1
2
3
4
5
6
7!/bin/bash
int=1
int<=5))
do
echo $int
let "int++"
donewhile循环读取用户输入:
1
2
3
4
5
6echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done无限循环:
①1
2
3
4while :
do
命令
done②
1
2
3
4while true
do
命令
done③
1
for(( ; ; ))
until循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。相当于C语言do-while
语法:1
2
3
4until 条件
do
命令
done示例:
[...]条件里前后必须有空格。1
2
3
4
5
6
7!/bin/bash
a=0
until [ ! $a -lt 10 ]#括号不能与其他字符相连只能和空格相连
do
echo $a
a=`expr $a + 1`
donecase … esac
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号;;表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。
语法:
1 | case 值 in |
取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。
一旦匹配成功,不再匹配其他模式。如无匹配,使用星号*捕获该值,在执行之后命令。
示例:
1 | !/bin/bash |
字符串:
1 | !/bin/bash |
- 跳出循环
①break(跳出所有循环)
示例:②continue(跳出当前(一次)循环,即少执行一次i=n时的命令,继续执行i=n+1以及之后的命令)1
2
3
4
5
6
7
8
9
10
11
12
13!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
5. test命令
test 命令是 Shell 内置的条件判断工具,用于评估表达式并返回布尔值(真/假),它通常与 if 语句结合使用,是 Shell 脚本中实现逻辑控制的基础。
语法:
1 | test 表达式 |
- 文件测试
| 操作符 | 描述 | 示例 |
|---|---|---|
| -e | 文件是否存在 | [ -e file.txt ] |
| -f | 是普通文件 | [ -f /path/to/file ] |
| -d | 是目录 | [ -d /path/to/dir ] |
| -r | 可读 | [ -r file.txt ] |
| -w | 可写 | [ -w file.txt ] |
| -x | 可执行 | [ -x file.sh ] |
| -s | 文件大小>0 | [ -s logfile ] |
| -L | 是符号链接 | [ -L symlink ] |
| 示例: |
1 | !/bin/bash |
- 字符串比较
| 操作符 | 描述 | 示例 |
|---|---|---|
| -z STRING | 字符串为空 | [ -z "$var" ] |
| -n STRING | 字符串非空 | [ -n "$var" ] |
| STRING1 = STRING2 | 字符串相等 | [ "$var1" = "$var2" ] |
| STRING1 != STRING2 | 字符串不等 | [ "$var1" != "$var2" ] |
- 数值比较
| 操作符 | 描述 | 示例 |
|---|---|---|
| -eq | 等于equal | [ "$a" -eq "$b" ] |
| -ne | 不等于not equal | [ "$a" -ne "$b" ] |
| -gt | 大于greater than | [ "$a" -gt "$b" ] |
| -ge | 大于或等于greater than、equal | [ "$a" -ge "$b" ] |
| -lt | 小于 less than | [ "$a" -lt "$b" ] |
| -le | 小于等于less than、equal | [ "$a" -le "$b" ] |
- 逻辑操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
| ! | 逻辑非 | [ ! -f "$file" ] |
| -a | 逻辑与 and | [ "$a" -eq 1 -a "$b" -eq 2 ] |
| -o | 逻辑或 or | [ "$a" -eq 1 -o "$b" -eq 2 ] |
- 高级用法
双括号[[]]- 支持模式匹配:
[[ "$var" == *.txt ]] - 支持正则表达式:
[[ "$var" =~ ^[0-9]+$ ]] - 更安全的字符串处理
- 支持模式匹配:
算数比较(())
- 专为数值比较设计:
(( a > b ))- 支持更复杂的算术表达式
6. echo命令
echo 是一个内置的 Shell 命令,用于在标准输出(通常是终端)显示一行文本或变量的值。
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。
- 基本用法
①简单文本输出②输出变量1
echo "Hello World"
③不带引号输出1
2name="Linux"
echo "Hello $name"
引号不是必须的,但建议使用以避免意外:引号不是必须的,但建议使用以避免意外:1
echo This is a test
- 常用选项
-n选项:不换行输出-e选项:启用转义字符输出
常用转义序列:
| 转义序列 | 说明 |
|---|---|
\n |
换行 |
\t |
水平制表位 |
\v |
垂直制表位 |
\b |
退格 |
\r |
回车 |
\\ |
反斜杠字符本身 |
- 高级用法
①输出到文件
重定向到文件:-
2>:将错误信息重定向到文件&>:将错误信息和标准输出重定向到文件追加到文件末尾:1
echo "this is a test" > output.txt
②彩色输出1
echo "add test" >> output.txt
使用 ANSI 转义码实现彩色文本:颜色代码:1
2echo -e "\033[31mRed Text\033[0m"
echo -e "\033[42;31mGreen Background with Red Text\033[0m"- 前景色:30(黑)、31(红)、32(绿)、33(黄)、34(蓝)、35(紫)、36(青)、37(白)
- 背景色:40-47 对应上述颜色
\033[0m重置所有属性
③输出命令执行结果
1 | echo "today is $(date)" |
7. read命令
Linux read命令用于从标准输入读取数值。
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
语法:
1 | read [参数] [输入] |
参数:
- -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
- -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
- -p 后面跟提示信息,即在输入前打印提示信息。
- -e 在输入的时候可以使用命令补全功能。
- -n 后跟一个数字,定义输入文本的长度,很实用。
- -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个 正常的字符了。
- -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
- -t 后面跟秒数,定义输入字符的等待时间。
- -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
示例:
1 | !/bin/bash |

