Linux期末知识点总结
Linux知识点总结
Linux概述
Linux系统的优缺点
- 优点:Linux系统主打网络服务,专业性强,免费开源,主要用于搭建服务器,性能稳定,长时间开机不出现卡顿,漏洞少,更安全;
- 缺点:Linux式子专业系统,对业余人员不友好,操作难度较高。
Linux系统的特点
- 一切皆文件
- 完全兼容可移植操作系统接口POSIX1.0标准
- 多用户、多任务
- 完全免费
Linux的含义
Linux是指在GPL协议下发行的遵循可移植性操作系统POSIX标准的操作系统内核。
通常说的Linux是指基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。
Linux是类UNIX操作系统。
Linux的诞生、发展和成长过程依赖五个重要支柱
- UXIX操作系统
- MINIX操作系统
- GNU计划
- POSIX标准
- Internet
Linux内核的组成
- 内存管理器:对内存资源的访问控制。
- 进程管理器:对CPU的访问控制。
- 设备驱动程序:实际控制操作系统和硬件设备之间的交互,并且提供一组操作系统可理解的抽象接口,完成和操作系统之间的交互,与硬件相关的具体操作细节也由设备驱动程序完成。
- 虚拟文件系统:VFS隐藏各种文件系统的具体细节,为文件系统提供统一的接口。
- 网络管理:管理各种网络设备,并实现各种网络协议栈,最终通过网络连接其他系统。
shell 分为
- GLI命令行界面
- GUI图用户界面
Linux文件系统
Linux一切皆文件;
文件系统是指文件存放在磁盘等存储设备上的组织方法。
Linux基本操作
基本命令
命令格式: command [options] [arguments] ,命令名:[选项]:[参数]
获取帮助
1 | man [option] filename |
1 | --help |more |
日志
Linux 日志文件存放在 /var/log目录下
日志记录了程序的运行状态,包括各种错误信息、警告信息和其他的提示信息。
文件系统和文件管理
Linux文件类型
- 普通文件
- 目录文件
- 链接文件
- 设备文件
- 管道文件
普通文件
- 普通文件是指以字节为单位的数据流类型文件,其特点是不包含文件系统的结构信息。
- 通常用户接触到的文件,如图形文件、数据文件、文档文件、声音文件等都属于普通文件。
- 按其内部结构分为文本文件和二进制文件。
目录文件
- 目录文件不存放常规数据,它是用来组织、访问其他文件的,是内核组织文件系统的基本节点。
- 目录文件可以包含下一级目录文件或普通文件。
- 目录文件是一种文件,是Linux文件中的一种
链接文件
- 链接文件是一种特殊的文件,是指向一个真实存在的文件链接(类似于Windows的快捷方式)。
- 根据链接文件的不同,分为硬链接(Hard Link)文件和符号链接(Symbolic Link,又称为软链接)文件
设备文件
- 设备文件是Linux中最特殊的文件,可以方便地访问外部设备。
- Linux为外部设备提供一种标准接口,将外部设备视为一种特殊的文件。用户可以像访问普通文件一样访问任何外部设备,使Linux系统可以很方便地适应不断变化的外部设备。
- 设备文件放在/dev目录下,设备文件使用设备的主设备号和次设备号来指定某外部设备。
- 根据访问数据方式的不同,设备文件分为:块设备和字符设备文件。
管道文件
- 管道文件是一种很特殊的文件,主要用于不同进程的信息传递。
- 当两个进程间需要传递数据或信息时,可以使用管道文件。一个进程将需传递的数据或信息写入管道的一端,另一进程则从管道另一端取得所需的数据或信息。
文件类型判断
1 | file [option] filename |
查看文件的详细属性
使用stat命令,例如,文件的名称、大小、权限、atime、ctime、mtime等
1 | state [option] filename |
显示当前工作目录
1 | pwd |
绝对路径和相对路径
- 绝对路径是以根目录“/”开始,递归每级目录直到目标路径。
- 相对路径是以当前目录为起点,到达目标的路径。
显示目录下的文件结构
1 | tree filename |
切换目录
1 | cd [directory] |
1 | ```cd ..```表示返回到上一级目录 |
- 显示所有隐藏文件
1
ls -a
- 显示所有以a开头的文件
1
ls a*
目录的创建和删除
创建
1 | mkdir [option] [dirname] |
dirname : 目录名称
参数:-p :创建多层目录,-v:显示创建过程信息
删除
rmdir命令只能用来删除空目录
1 | rmdir [option] [dirname] |
dirname : 目录名称
文件的创建、查看、复制、移动、删除、排序
创建
1 | touch [option] filename |
查看
1 | cat [option] filename |
- 用来显示文件内容, 依次读取其后所指文件的内容并将其输出到标准输出设备上。
- 能够用来连接两个或者多个文件,形成新文件。
more命令以逐页的方式显示文件的内容.
less命令也是对文件或其他输出进行分页显示。
head命令可以查看文件的前几行的内容。
tail命令查看文件的后几行的内容
复制
1 | cp [option] source dest |
source表示需要复制的文件,dest 表示需要复制到的目录。
移动
1 | mv [option] source dest |
为文件或目录改名或者将文件由一个目录移动到另一个目录中
删除
1 | rm [option] filename |
- 删除一个目录中的一个或者多个文件。
- 将某个目录及其下的所有文件及子目录均删除。
- 对于链接文件,只是删除了链接,原有文件均保持不变
排序
对文件中的各行进行排序。
1 | sort [option] filename |
文件查找
以指定的查找模式搜索文件,通知用户在什么文件中搜索到与指定模式匹配的字符串,并且打印出所有包含该字符的文本行,该文本行的最前面是该行所在的文件名。
1 | grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][–help][范本样式][文件或目录…] |
find:从指定的目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对其采取相关的操作。
1 | find [pathname] [option] filename |
linux 文件链接
硬链接
- 默认情况下,每个文件有一个硬链接,该硬链接会给文件起名字。
- 创建一个硬链接时,也为这个文件创建了一个额外的目录条目。
硬链接的局限性
(1)硬链接不能引用自身文件系统之外的文件,即不能引用不在同一磁盘分区的文件。
(2)硬链接无法引用目录。
当硬链接被删除时,只是删除了这个链接,但是文件本身的内容依然存在,除非该文件的所有链接都被删除了
符号链接(软链接)
符号链接指向的文件与符号链接自身几乎没有区别。
文件时间
在Linux系统中,文件是没有创建时间的,如果新创建一个文件,它的三个时间都是与创建的时间相同。
1.访问时间(Access time)
对文件内容进行一次读操作时间。
2.修改时间(Change time)
文件内容被最后一次修改的时间。
ls -l 命令显示出来的文件时间就是这个时间
3.状态时间(Modify time)
当文件的状态被改变时,状态时间就会改变
Linux用户管理
超级用户可以对普通用户进行跟踪,并限制它们的访问权限,以保证系统安全。
Linux系统并不能识别用户账号名称信息,所以每个用户都有一个唯一的系统可识别的UID
id命令可以查看当前用户登录信息。
- UID(User Identification)为用户的ID。
- GID(Group Identification)为用户所属组的ID。
- groups为用户属于的所有组的ID。
ps aux | less命令查看进程
用户分类
- root用户:拥有最高权限,ID为0。
- 普通用户:可以登录,由管理员创建,使用权限有限。
- 系统用户:不具有登录的能力,但是系统运行不可或缺的。
管理用户组
- useradd用来添加用户。
- passwd修改用户口令。
- usermod修改用户信息。
- userdel删除用户。
添加用户
添加用户就是在系统中创建一个新账号,并为新账号分配用户ID、用户组、主目录和登录Shell等资源。
1 | useradd [option] username |
username表示新账号的登录名
修改用户口令
用户账号刚创建时没有口令,无法使用,必须为其指定口令后才可以使用,即使是空口令。
1 | passwd [option] [username] |
- username参数没有指定时,表示修改当前用户的口令。
- 如果指定了该参数,则表示修改指定用户的口令,只有root用户才有修改指定用户口令的权限
删除用户
删除用户就是删除与用户有关的系统配置文件中的记录(如/etc/passwd)
1 | userdel [option] username |
修改用户信息
修改用户信息就是更改用户的属性,如用户 ID、主目录、用户所在组、登录Shell等。
1 | usermod [option] username |
gpasswd命令–从用户组中移出一个用户
1 | gpasswd [-a user][-d user][-A user,...][-M user,...][-r][-R]groupname |
管理用户组
用户组是具有相同特征用户的集合,每个用户都有一个用户组,方便系统集中管理一个用户组中的所有用户
添加用户组
1 | groupadd [option] group_name |
删除用户组
1 | groupdel group_name |
修改用户组
1 | groupmod [option] group_name |
查看用户的分组
- groups命令查看。命令:
1
2groups
groups user1 user2 - 查看文件/etc/group法,通过grep命令查询某个用户所在的用户组。
- id命令法,只执行id命令就可以查看。命令:
1
2id
id user2
和用户相关的一些系统文件
- /etc/passwd文件保存用户信息。
- /etc/shadow文件保存加密的用户密码。
- /etc/group文件保存用户组信息。
- /etc/login.defs配置文件。
su root可以返回root
文件权限
权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。
U G O
U: owner为属主,文件所有者。
G:group为属组,同组用户。
O:other为其他用户。
UGO方式每组的3个字符具体意义如下:
r:read,数字设定值为4
w:write,数字设定值为2
x:execute,数字设定值为1
设置文件属性和权限
改变文件所属用户命令chown
文件所有者修改为指定的用户
1 | chown [-cfhvR] [--help] [--version] user[:group] file... |
| option | explanation |
|---|---|
| -c | 显示更改的部分的信息 |
| -f | 忽略错误信息 |
| -h | 修复符号链接 |
| -v | 显示详细的处理信息 |
| -R | 处理指定目录以及其子目录下的所有文件 |
| –help | 显示辅助说明 |
| –version | 显示版本 |
改变文件所在组命令chgrp
变更目录和文件的所属组,只有超级用户才拥有此权限。
1 | chgrp [option] group file |
| option | explanation |
|---|---|
| -c或–changes | 效果类似”-v”参数,但仅回报更改部分。 |
| -f或–quiet或–silent | 不显示错误信息。 |
| -h或–no-dereference | 只对符号连接的文件作修改,而不更动其他任何相关文件。 |
| -R或–recursive | 递归处理,将指定目录下的所有文件及子目录一并处理。 |
| -v或–verbose | 显示指令执行过程。 |
| –reference=< | 参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。 |
修改文件或目录的权限chmod
1 | chmod [ugoa...][[+-=][rwxX]...][,...] |
u表示该文件的拥有者,g表示与该文件的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是。
+表示增加权限、-表示取消权限、=表示唯一设定权限。
r表示可读取,w表示可写入,x表示可执行,X表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
修改文件权限的方法有2种
- 符号法(表达式法)
1
chmod [who] [operator] [mode] file
- who指定用户身份,若此参数省略,则表示对所有用户进行操作。
- operator表示添加或取消某个权限,取值为“+”或“-”。
- mode指定读、写、执行权限,取值为 r、 w、 x 的任意组合。
- 数字法
1
chmod 数字 file
存储在磁盘上的文件就像是一个链表,表头是文件的起始地址,整个文件不连续存放。
基础权限ACL
主要提供传统的UGO的r、w、x权限之外的具体权限设置,对单一用户,单一文件或目录进行权限设置。
getfacl命令
1 | getfacl [-aceEsRLPtpndvh] file ... |
setfacl命令可以设置ACL权限
1 | setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... |
linux编程基础
make可以获知所管理项目中源文件的修改情况,根据程序员设定的规则,自动编译被修改过的部分,
make通过makefile文件描述的内容自动维护编译工作。
shell编程
Shell脚本是一个包含一系列命令的文件。
Shell自动读取这个文件,并执行这些命令,与直接输入命令行得到结果一样。
用Shell脚本的原因:
- 效率高:如果让Shell记住这些命令并自动完成输入将会大大提升效率。
- 简单性: 通过Shell高级语言,可以简洁地表达复杂的操作。
- 可移植性:使用POSIX定义的功能,可以做到脚本无须修改就可在不同系统上执行。
- 开发容易:可以在短时间内完成一个功能强大又好用的脚本。
Shell分类:
- 用于用户交互接口的Shell称为交互式Shell。
- 作为命令解析器的Shell称为非交互式Shell。
#!/bin/bash
脚本第一行开头的“#!”是一个约定的标记,称为shebang,用来告知操作系统需要用什么解析器来执行此脚本,
Shell的注释以“#”开头,注释的内容不会执行。
给文件helloxiangtian.sh增加可执行权限
1 | chomd +x helloxiangtan.sh |
Shell变量命名规则:
变量名必须由大写字母(A~Z)、小写字母(a~z)、数字(0~9)或下画线构成;变量名的第一个字符不能是数字。
shell变量分类
Shell变量分为自定义变量、环境变量、位置变量和预定义变量。
根据工作要求临时定义的变量称为自定义变量。
环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行,如$0、$1、$#。
从命令行、函数或脚本执行等处传递参数时,$0、$1称为特殊位置变量。
预定义变量是在bash(默认Shell)中已有的变量,可以直接使用,如$@、$*等。
Shell变量只有字符串一种类型,即无论给 Shell变量赋予什么值,在存储时都会转换为字符串。
自定义变量
| 定义自定义变量 | 变量名=变量值,变量名必须以字母和下划线开头,如ipl=192.197.1.1。 |
| 使用自定义变量 | $变量名 |
| 查看自定义变量 | echo $变量名 set(所有变量:自定义变量和环境变量) |
| 取消自定义变量 | unset 变量名 |
| 自定义变量作用范围 | 仅在当前shell中有效 |
环境变量
在各种编程语言中会提及全局变量概念。
全局变量可以在程序的任何地方使用。
在Shell编程中该功能由环境变量实现。
系统中的所有进程都可以使用环境变量。
环境变量与全局变量区别:
子进程对环境变量的修改不会传递到父进程中。
| 定义环境变量 | 使用export命令声明。例如,export back_dir=/home/user例如,export ipl 将自定义变量转换为环境变量。 |
| 使用环境变量 | $变量名或${变量名} |
| 查看环境变量 | echo $变量名 或env,如env |
| 取消环境变量 | unset 变量名 |
| 环境变量作用范围 | 仅在当前shell和子shell中有效 |
位置变量
位置变量用于在命令行、函数或脚本中传递参数,其变量名不用自己定义,其作用也是固定的。
执行脚本时,通过在脚本后面给出具体的参数(多个参数用空格隔开)对相应的位置变量进行赋值。
1 | 0代表命令本身,$1-$9代表接收的第1~9个参数,$10以上需要用{}括起来,如${20}代表接收的第20个参数。 |
预定义变量
预定义变量在Shell中可以直接使用,位置变量也是预定义变量的一种。
| 预定义变量 | 说明 |
|---|---|
| $0 | 脚本名 |
| $* | 所有的参数 |
| $@ | 所有的参数 |
| $# | 参数的个数 |
| $$ | 当前进程的PID |
| $! | 上一个后台进程的PID |
| $? | 上一个命令的返回值,0表示成功。 |
变量的操作
变量创建只需要指定变量名称和变量值,它们之间用等号(=)连接,等号两边不能有空格。
变量创建好后,可以用$变量名的方式获取变量的值。
可以使用$符号获取变量的值。
用户可以通过export命令将Shell变量导出为环境变量,但没有办法将环境变量再恢复成Shell变量。
变量的删除
| 格式 | 说明 |
|---|---|
| ${变量名#关键字符} | 变量内容从头开始的数据符合“关键字符”,则将符合的最短数据删除。 |
| ${变量名##关键字符} | 变量内容从头开始的数据符合“关键字符”,则将符合的最长数据删除。 |
| ${变量名%关键字符} | 变量内容从尾开始的数据符合“关键字符”,则将符合的最短数据删除。 |
| ${变量名%%关键字符} | 变量内容从尾开始的数据符合“关键字符”,则将符合的最长数据删除。 |
变量的替换
|格式 |说明|
|:—:|:—:|
|${变量名/旧字符串/新字符串}| 若变量内容符合“旧字符串”,则第1个“旧字符串”会被“新字符串”替换。|
|${变量名//旧字符串/新字符串} | 若变量内容符合“旧字符串”,则全部“旧字符串”会被“新字符串”替换。|
变量的替代
1 | {变量名-新的变量名} |
在Shell中,变量值的类型默认是字符串,不直接进行运算。
用于整数运算的方法有expr、(())和$[]。
运算
1 | expr expression |
运算符及用于计算的数字两边必须有空格,否则会执行失败。
用expr进行乘法运算时,必须在前用反斜线转义(Shell可能误解为号)。
“(())”或“[ ]”数值运算命令
双小括号 “(())” 的作用是进行整数运算和数值比较,其效率很高,用法也非常灵活,是企业中常见的运算操作符
格式:
“ ((expression))”,或“ [expression]”
括号内部两侧可以有空格,也可省空格。
需要直接输出运算表达式的运算结果时,可以在“ ((表达式))”前加$符
1 | n1+n2 |
let数值运算命令
1 | let expression |
let数值符号可以直接进行计算,且不带回显功能,也就是说当使用let的时候,不再使用$引用变量
shell中的特殊符号
1. “#”表示注释。
- 行首为#(#!是个例外)表示此行是注释。
- 注释也可以放在本行命令的后面,需要注意的是#两边有空格。
- 释也可以放在本行行首空白的后面。
2. “ ; “
- “;”在同一行中分隔两个或者两个以上的命令。
- “;”也适用于循环语句
3. “;;”
- 用于终止case语句
4. “:”
- 空命令“:”和true命令作用相同。
- 在while死循环和if/then中也可使用这个命令。
5. “.”
- “.”等价于source命令,是bash中的一个内建命令。
- “.”也可以作为文件名的一部分,如果“.”放在文件名的开头,那么这个文件将会成为“隐藏文件”。ls命令将不会正常显示出这个文件。
- 当点作为目录名时,一个单独的点代表当前工作目录,而两个点表示上一级目录。
输入输出
输出
echo
echo命令是最常用的,其功能是将字符串输出到屏幕
1 | echo [-ne] [string] |
其中,string表示要输出的字符串。选项n表示输出不换行。选项e表示处理特殊字符
printf
输出命令printf的功能是格式化输出数据
1 | printf format [arguments...] |
format为输出格式,用单引号或双引号包围都可以。“%s”为格式符,表示输出的格式为字符串,还有“%d”、“%c”、“%f”等,代表的格式与 C 语言中的相同。
arguments为要输出的数据。
输入
1. 直接给变量赋值
例如,name=liming
2. 从键盘读入赋值
- read命令可以通过从标准输入设备(键盘)读取一行数据赋值给变量。
1
read [options] [variable…]
3. 使用命令行参数赋值
使用命令行参数赋值是直接在命令后面跟参数,系统用$1来调用第一个参数,用$2调用第二个参数……,这种赋值方法适用于参数经常变化且不需要交互的情况。
4. 利用命令的输出结果赋值
- 在Shell程序中,可以将一个命令的输出结果当作变量的值(需要在赋值语句中使用反向单引号)。
- 把命令的结果作为变量的内容进行赋值的方法,在脚本开发时很常见,如按天打包网站的站点目录程序,生成不同文件名
5. 从文件中读入数据赋值
这种方式就适合处理大批量的数据,直接把相应的数据写入文件中,通过脚本中的命令把文件中的数据读取到脚本程序中以便使用。
引用
1 | 1. 转义字符:用于引用任意的单个字符。 |
条件测试
文件测试
- test
1
“test <expression>”
- “<测试表达式>”
也可以使用“<测试表达式>”,就是使用中括号。
语法格式:
“ [
注意:[]与expression之间必须有空格。
通过[]进行条件测试的方法,与test命令用法相同,推荐使用此方法。
整数测试
整数测试通常用于数值之间的运算。
1 | 语法格式: |
| 操作符1 | 操作符2(部分能用) 意义 |
|---|---|
| -eq == | 等于(Equal) |
| -ge >= | 大于等于(Greater or Equal) |
| -gt > | 大于(Greater Than-le) |
| -le <= | 小于等于(Lesser or Equal) |
| -lt | < 小于(Lesser Than) |
| -ne != | 不等于(Not Equal) |
字符串测试
字符串测试操作包括比较字符串是否相同、测试字符串的长度是否为0。
1 | [ 字符串1 = 字符串2 ] |
逻辑运算符
1 | [ expression1 op expression2 ] |
| Operator | 意义 |
|---|---|
| ! expr | 如果表达式评估为假,则为真 |
| expr1 -a expr2 | 如果 expr1 和 expr2 都为真,则结果为真,&& |
| expr1 -o expr2 | 如果 expr1 或 expr2 为真,则结果为真, |
if语句格式
1 | 语句格式: |
1 | if [ expression ];then code1 |
1 | if expression; then |
case
1 | case value in |
循环
while 命令
1 | while expression; do |
until命令
1 | until expression; do |
for循环
1 | for variable in [in sequence] |
1 | for 变量名 in 取值列表;do 循环体 done |
1 | for variable [in sequence]; do |
1 | for ((expression1; expression2; expression3;));do |
在循环后面加个 & 符号表示在后台执行
数组
数组分为普通数组和关联数组。
普通数组中的索引(下标)都是整数。
关联数组的数组索引可以用任意的文本。
两者最大区别:
- 关联数组使用之前需要声明。
- 关联数组是由特定格式的键值对组成
普通数组
定义:
1 | arrayname=(value_table) |
value_table中值之间用空格隔开。
关联数组
定义:
1 | arrayname=([indexe1]=value1 [indexe2]=value2 ...... [indexen]=valuen) |
其中:
indexei可以用标识符表示。
声明普通数组方法:
#declare -a arrayname
声明关联数组方法:
#declare -A arrayname
数组定义方法
直接定义数组
1
arrayname=(value1 value2 value3 ... valuen)
下标定义数组
1
array_name=([index1]=value1 [index2]=value2 ...)
间接定义数组
1 | array[0]=value1;array[1]=value2;.... |
- 从文件中读入定义数组。
1 | array_name=($(command)) |
访问数组表达式
| 语法 | 描述 |
|---|---|
| echo ${!array[*]} | 访问数组所有索引 |
| echo ${!array[@]} | 访问数组所有索引 |
| echo ${array[*]} | 访问数组所有值 |
| echo ${array[@]} | 访问数组所有值 |
| echo $ |