本文建立于Linux的课堂学习
Linux基础
1. Linux操作环境
1.1 简述Linux文件类型有哪些
-
普通文件,如文本文件,文件属性表示为-
-
目录,文件属性表示为d(directory)
-
链接文件,一般指文件的符号链接,又叫软链接文件属性表示为l(link)
-
块设备,一般指硬盘软盘等存储设备文件表示为b(block)
-
字符设备,以字节流的方式进行访问,通常要用到open、close、read、write等系统调用,字符终端、穿孔设备和键盘等就是字符设置。另外字符设备文件是一文件流的方式进行访问的,因此可以顺序读取,但通常不支持随机存取,文件表示为c(char)
-
管道文件,主要用于进程间通信,文件表示为p(pipe)
-
套接字文件,主要用于通信,特别是在网络上,文件表示为s(socket)
1.2 简述Linux的文件访问权限
Linux系统是典型的多用户系统,针对与不同用户,不同组中的用户对文件的访问,操作权限有不同的设置
使用ls -l指令可查看文件的访问权限
最前面的10个字母就是用来表示文件的访问权限
- 第一个字母表示文件类型就是上面所说的文件表示
- 第2到4个字母表示用户权限,r表示可读,w表示可写,x表示可执行
- 第5到7个字母表示文件所属组的权限,r表示可读,w表示可写,x表示可执行
- 第8到10个字母表示除上面限定的其他用户的权限,r表示可读,w表示可写,x表示可执行
可以使用chmod来对文件的访问权限进行修改
上面的字母也可以用数字表示
从2到10字母每3个组成一个 r表示4,w表示2,x表示1,例如一个文件中用户可读写执行,同组的可读,其他用户可读 就用数字表示为744
1.3 简述shell的功能,常见的shell有几种
shell为用户提供操作系统的接口,他是命令语言、命令解释程序以及程序设计语言
当从shell或其他程序想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)
其中Ubuntu使用的是bash也就是Bourne Again shell
1.4 列举几个常用的Shell环境变量以及用途
- PATH:命令搜索路径
- HOME:用户加目录路径
- PWD:当前路径
- HOSTNAME:主机名
- SHELL:用户当前使用的SHELL
- PS1:一级命令提示符
- TMOUT:用户和系统交互过程的超时
- IFS:系统输入分割符
- OFS:系统输出分隔符
- HISTSIZE:历史命令保存的最大行数
2. Linux Shell命令操作
2.1 简述在Linux Shell中获取帮助的哪些方法
-
–help,几乎所有的Linux命令都提供–help选项
-
man,Linux的系统手册
-
info,类似 “man”,但可显示更完整的最新的GNU工具信息。以类似html文件的格式组织,即支持回退,超链接等操作
2.2 列出常用的通配符
- *:匹配多个字符
- ?: 匹配单个字符
- […]: 匹配括号中出现的任意一个字符,例如[abc].txt匹配到的就是a.txt,b.txt,c.txt
- [!..]:排除括号中的任意字符
- {…}: 生成序列,每个元素之间用逗号分割,如{a,bc},生成a,bc两个元素
2.3 列出Linux shell中,在\后面的转义字符,并说明转义字符的作用
对于输出一些特殊字符需要使用\来进行转义
如:
?、>、<、|、*、[、]、{、}、\、`、$、#、"、/、%、;、&
转义字符就是作用于程序理解上,把这些字符转义为一般的字符处理,而不是程序中的关键字的使用
2.4 Linux shell的三种引号,以及其用法
- 双引号:在双引号中除了$,",`和\以外所有字符全部解释为符号本身
- 单引号:在单引号中的所有字符包括上面的特殊字符都解释成字符本身而成为普通字符
- 反引号:在分引号中的字符串将被解释成Shell命令执行
2.5 简述Linux中管道的作用
管道式Linux中一种重要的通信方式,是把一个程序的输出直接连接到另一个程序的输入,连接多个程序组成一个复杂的程序。
2.5.1 管道的实现机制
在Linux中管道是一种使用非常频繁的通信机制,从本质上说,管道是一种特殊的文件,管道可以克服使用文件进行通信的两个问题
- 限制管道的大小,实际上,管道是一个固定大小的缓冲区,在Linux中,该缓冲区大小为1页,也就是4K字节,使得他的大小不像文件哪样不校验的增长,使用单个固定缓冲区也会带来问题,比如在写管道时可能写满,当这种情况发生时,随后对管道的写操作就会被默认阻塞,等待某些数据被读取,以腾出足够的空间以写
- 读取程序也可能比写程序快,当所哟当前进程数据已经被读取是,管道为空,所有的后续读操作都会阻塞,等待某些数据的写入,才能继续读
2.6 Linux Shell打开时会默认打开3个标准文件,分别是什么,文件描述符是什么
- 标准输入 (STDIN)文件描述符为0
- 标准输出(STDOUT)文件描述符为1
- 错误输出(ERROUT)文件描述如为2
2.7 Linux 中输入重定向指什么,指令是什么
一般情况下命令的输入是从标准输入的地方读取输入,但也可以重定向到从文件中读取输入写入到命令中
- 可使用 < 来使指定文件作为命令的输入
cat < test.txt
- 可以使用 << 来从控制台进行输入,直到输入<<后面自定义字符才终止输入
cat << +
2.8 输出重定向指的是什么,指令是什么
输出可能为正确输出,错误输出,一般都会将所有输出都输出到控制台,输出重定向就是可以设置输出到文件中,既可以设置正确输出到文件中,也可设置错误输出到文件中
可以使用
-
可以使用 > 来将标准正确输出到指定文件中,采用覆盖写的方式
ll text > finish
-
可以使用2> 将标准错误输出到指定文件中,采用覆盖写的方式
ll test2 2> error
3. 可使用 >> 来将标准输出到文件中,采用追加写的方式
ll test >> finsh
-
可使用2>> 将错误输出到文件中,采用追加写的方式
-
可使用 1 > file1 2> file2 来分别将标准输出到file1中将错误输出到file2中
-
可使用 1>> file1 2>&1 来将标准输出和错误输出到同一个文件中采用追加的方式
2.9 简述有哪些“浏览及搜索文件系统”命令,并说明命令用途
-
find
- 在在文件目录树中搜索文件
-
witch
- 在环境目录$PATH中查找符合条件的文件,查看当前生效的命令是哪个
-
whereis
- 根据文件名搜索二进制文件、手册页文件、源代码文件
-
local
- 在保存文件和目录的系统数据库中查找文件符合指定模式的文件,系统数据库一般每天自动更新一次,速度比find快,但是可能搜索不到最近更新的文件
2.10 文件系统操作
-
扩充磁盘大小
-
进入系统
使用fdisk -l 查看磁盘
-
添加新的分区
使用fdisk /dev/sda
可在/dev/sda上进行操作
输入m查看帮助文档
输入n可创建新的分区
然后一直按回车即可(当然针对需要可以执行输入)
最后确定无误后输入w保存退出
此时就已经创建分区成功了 -
初始化分区
pvcreate /dev/sda4
这里就是上面创还能的分区的名称 -
将分区设置为ext3格式的文件系统
mkfs -t ext3 /dev/sda4
-
将分区挂载到一个文件中
mkdir /mnt/sda4
sudo mount /dev/sda4 /mnt/sda4
-
查看分区
df -h
-
*取消挂载
umount /mnt/sda4
可取消上面挂载到/mnt/sda4目录的磁盘
2.11 用户组操作
- 添加用户
要求创建一个叫ywh 的用户,需要创建/home下家目录,默认的shell为bash
指令为useradd -m -b /home -s /bin/bash ywh
参数解释
m: 创建家目录
b: 指定家目录所在的目录
s: 指定默认的shell
d: 指定家目录的名称
G: 指定辅组id
g: 指定主组id
N: 不创建同名组
-
删除用户
sudo userdel 用户名
可删除用户
-
添加组
sudo groupadd 组名
-
删除组
sudo groupdel 组名
3. LinuxShell编程
3.1 基础知识
3.1.1 常见的shell种类
- sh
全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。 - bash
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。 - tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。 - acsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。 - csh
由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh
3.1.2 常见的shell命令种类
-
内部命令
shell解释器默认支持的命令,系统中没有相应的支持文件不需要加sudo,例如cd,source,echo等 -
shell命令
像shell语言一样书写一系类代码,可以像其他语言一样被引用 -
外部命令
独立于shell的可执行程序,在文件系统中有相应的可执行文件
如ls,find,delete,gerp,config等
命令行会建立一个当前的shel的复制进程来执行,在执行过程中存在进程创建和销毁
3.1.3 列出shell命令的执行顺序
别名->关键字->函数->内置命令->外部命令
在同名时别名的优先级最高,外部命令的优先级最低
3.1.4 shell中的注释状态,退出状态,逻辑命令和复合操作
- 注释
采用#来表示注释
要加空格来进行区分 - 退出状态
使用$?可以获取上一条指令的执行返回结果,也就是退出状态
正常返回0,返回非0就是执行错误
-
逻辑命令
shell中支持的逻辑运算符有;,||,&&三种
-
复合操作
{}在本shell中执行,()在子shell中执行
3.2 Shell变量
-
变量的赋值与引用
- 使用=来进行赋值,但是=两侧不能有空格
- ${变量名},当需要引用变量的值而且变量后面有非空字符串时,需要使用{}来包围变量
- ${#变量名}获取变量的长度
- unset删除变量的值
-
命令替换
- ``反引号,当要使用命令的执行结果作为变量的值时,可将命令放到反引号中
- $(),同上面一样,可以将命令的执行结果作为变量的值
、
-
变量属性声明
- 使用内部指令 declear typeset可以设置变量属性
-r 只读 -i整数
-a数组 -f函数
-x导出变量
- 使用内部指令 declear typeset可以设置变量属性
-
声明数组
类似于C程序中声明数组一样,使用变量名而不适用[]来指定下标默认是0号元素
使用[*]和[@]来表示数组中非空元素 -
变量引用操作
- {varrame:-‘str’},当变量varname为空时,返回str,但是变量依然是未定义状态
- {varname:+‘str’},当变量varname为空时,返回空串,当变量不为空串时返回str
- {varname:=‘str’},当变量为空时,返回str,并将变量的值置为str
- {varname:?‘str’},会判断varname是否为空串,当为空串时会抛出错误,并将错误信息设置为str,并将程序终止
上面的四个操作中如果不加冒号,则判断的是varname是否定义,而不是是否为空串
-
模式匹配替换
1. {varname#patten}:在varname变量值从头开始,匹配满足后面pattern的最小子串,并将其删除,最后输出,但是对于原变量的值不进行改变
2. {varname##pattern}:在varname变量值从头开始,匹配满足后面pattern的最大子串,并将其删除,最后输出,但是低于原变量的值不进行改变
3. {varname%pattern}: 在varname变量值中从尾开始,匹配满足后面pattern的最小子串,并将其删除,最后输出,但是对于原变量的值不进行改变
4. {varname%%pattern}:在varname变量值中从尾开始,匹配满足后面apttern的最小子串,并将其删除,最后输出,但是对于原变量的值不进行改变
5. {varname/pattern/str}:匹配varname变量的值,满足pattern替换为str,但是对于原变量的值不进行改变 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1590950e87104b818f42358132ef435c.png)
-
位置参数和特殊变量
1. 位置参数
也称为位置变量,使用0,1,2,3…这些整数来命名,使用$0,$1,$2,$3,来进行引用,$0用来表示命令名称,1对应第一个参数,往后排序
$#返回命令行上的参数个数
$* 以单个字符串显示想脚本创徐传递的所有参数。但是不包含$0
$@从参数1开始,显示想脚本程序传递的所有参数,不包含 0 。如果放在双引号中进行扩展,这 " 0。如果放在双引号中进行扩展,这" 0。如果放在双引号中进行扩展,这"@“于”$1"“$2"”$3"…等效
$?上一条指令执行后的返回值
$$运行脚本的当前进程的进程号
$!上一个后台指令对应的进程号
$-有当前shell设置的执行标志名组成的字符串
2. 使用内部指令set来设置参数
3. 使用内部指令shift来移动位置参数,即$2的值传递给$1
-
read命令
- 变量个数等于给定数据个数相同,则依次对应赋值
- 变量个数小于数据个数,则会将剩下的值赋值给最后一个变量
- 变量个数大于数据个数,则会依次对应赋值,而没有数据与之对应的变量采取空串
- 如果省略了所有变量,则输入的数据会保存在环境变量REPLY中
- 变量个数等于给定数据个数相同,则依次对应赋值
-
export命令
程序中要访问外部的变量的值,默认只有HOME,MAIL,PATH, PWD这几个能够访问,其他在外部定义的变量的值无法传入脚本中
export可敬变量设置为环境变量
3.3 控制结构
-
测试条件 test
- 格式 test 表达式 或者使用 [ 表达式 ]
- 如果表达式的值为真,其退出状态为0(成功),否则退出值为非零
- 使用[]来表示表达式时,两侧都需要空格
- 表达式中的变量最好要使用双引号括起来
- 测试文件
- 测试字符串
、 - 测试数值
- 逻辑测试
-
let命令
- 专门执行整数算术运算的命令
- 格式:let <表达式> 或者 (( 表达式 ))
- 表达式建议用双引号括起来,当表达式中有shell的特殊字符(如"|")是,必须要使用双引号
- 操作数只能是整数
- 命名的参数在算术表达式中可直接用名称访问,前面不用带 $ 符号,也不需要对算术表达式中的操作符进行转义
- 如果算术表达式求出的值为0,则设置退出状态为1,如果求值为非零值,则退出状态为0
- 使用$((表达式))获得表达式的值而不是退出状态
-
if 语句
-
case 语句
2. 实现字符串匹配
3. 多个模式,模式间使用|进行隔开
![在这里插入图片描述](https://img-blog.csdnimg.cn/eb11817342cf4c64ae7109ab60831652.png)
-
while 语句
-
until语句
-
for 语句
-
break,continue,exit语句
-
select语句
3.4 shell函数
y被声明为local,局部变量在外部不能访问
3.5 Shell内部命令
- eval命令
首先扫描参数,所有参数被读取并连接(扩展)成一个字符串,然后eval在将该字符串当成命令执行
- exec 命令
在本Shell中执行参数指定的命令,该命令将替代本Shell进程,即执行命令后命令行Shell将不复存在,命令将推出整个Shell就退出了
- readonly 命令
标记给的那个的变量名是只读的,等价于 declare -r
如果没有指定参数,则列出所有只读变量的清单
- tarp命令
格式 tarp [arg] [n]
用于捕获信号
n是要捕获的信号,arg是捕获信号后要执行的命令
- set命令
可设置已经定义的全部变量
设置位置参数的值
设置shell脚本的执行选项 - wait命令
3.6 shell程序调试
可使用echo来打印输出提示
也可以使用set -x或-v选项将Shell设置为跟踪模式
或者使用bash -x 来设置跟踪模式运行shell
4. Linux C语言编程基础
4.1 gcc编译器
- 只进行预处理 使用-E参数
- 编译到汇编文件 参数-S
- 编译到目标代码
- 显示更多的警告信息
- 在可执行文件中包含标准的调试信息
- GDB调试文件
5. 文件
5.1 Linux文件I/O概述
- 概述
- 在Linux中,几乎任何事物都可以用一个文件来表示,或者通过特殊的文件提供支持
- 文件为操作系统服务和设备提供了一个简单而一致的接口
- 大多数Linux文件I/O只需要用到5个函数:open,read,write,lseek和close
- 使用stat,access等其他I/O函数可以获取或者设置文件的状态和权限等信息
- 目录文件有一些简单而特殊的编程接口
- 文件和目录
- 文件的属性被保存在文件的索引节点中
- 索引节点是文件系统中一个特殊的数据块,用以保存文件自身的属性
- 文件使用设备号
- 索引节点号
- 文件访问权限和文件类型
- 文件硬链接数
- 所有者用户ID,组ID
- 设备文件的设备号
- 文件大小(单位为字节)
- 包含该文件的磁盘块的大小
- 改文件所在的磁盘块
- 文件最后访问时间
- 文件最后修改时间
- 文件状态最后改变时间
- 目录是用于保存其他文件的节点号和名字的文件,是将文件的名称和他的索引节点号结合在一起的一张表
- 目录中每一堆文件名称和索引节点号称为一个“连接”
- 目录文件中每个数据项都是指向某个文件节点的连接
- 磁盘中的普通文件和目录文件都是有相应的磁盘区域存储数据。这些数据是存储在由索引节点指定的位置上的
- 特殊文件(如设备文件)不具有相应的磁盘存储区域
- 硬件设备在Linux中通常被映射为文件,即设备文件,设备文件被放在/dev目录下
- 硬件设备科分为字符设备和块设备
10.终端设备- 一种字符设备,有多种类型
- 简称tty,是Teletype的缩写
- 系统调用和标准函数库
- 系统调用是Linux内核直接提供的编程接口,在内核空间运行
- C语言标准函数库是由一些函数构成的集合,完全隐形在用户空间
- 直接使用底层系统调用I/O操作效率较低
- 执行系统调用时,Linux必须从用户空间切换到内核空间,然后再切换回来
- 硬件会显示系统调用 一次须读写的数据块大小,如设备块设备
- 应让每次系统调用完成尽可能多的工作
- C语言标准函数库带有缓冲机制
5.2底层文件访问
-
文件描述符
- 一个非负整数,对于内核而言,所有打开文件都是由文件描述符引用
- 当打开一个现存文件或创建一个新文件时,内核想进程返回一个文件描述符
- 从内核源码的角度看,文件描述符其实是当前进程所打开的文件结构数组的下标
- 有三个特殊的文件描述符(位于<unistd.h>头文件中)
- 0 STDIN_FILENO 标准输入
- 1 STDOUT_FILENO 标准输出
- 2 STDERR_FILENO 标准错误输出
-
open
- 打开或创建一个文件
#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int ioen(const char*pathname, int flags); int open(const char*pathname, int flags, mode_t mode);
- 参数
- pathname 要打开或创建的文件的名称
- flags 有下列一个或多个常数进行或运算构成
- O_RDONLY 只读
- O_WRONLY 只写
- O_RDWR 读写
- O_APPEND 追加写
- O_CREAT 若此文件不存在则创建它,应该结合第三个参数mode使用
- O_EXCL 结合O_CREAT,当文件不存在时,才创建文件
- O_TRUNC 如果此晚间存在而且可写,则将其长度截短为0
- mode 春去许可权位,一个32位无符号整数,仅当创建新文件时才使用,最终文件权限受系统变量umask显示 是“mode & ~umask”
- S_IRUSR 文件所有者读
- S_IWUSR 文件所有者写
- S_WXUSR 文件所有者执行
- S_IRGRP 组用户读
- S_IWGRP 组用户写
- S_IXGRP 组用户执行
- S_IROTH 其他用户读
- S_IWOTH 其他用户写
- S_IXOTH 其他用户执行
- 返回值
- 成功是返回一个文件描述符
- 失败是返回-1,并将全局变量errno进行赋值,表明失败原因
- 由open返回的文件描述符一定是最小的未使用的描述符
-
close
- 关闭已经打开的文件
#include<unistd.h> int close(int fd);
- 参数
- fd 待关闭的文件描述符
- 返回值
- 成返回0,失败返回-1
- 调用close函数后,终止了文件描述符与文件之间的关联,被关闭为文件描述符重新变为可用
- 同时释放了该进程在该文件上的所有记录锁
- 当一个进程终止是,他所打开的所有文件都将由内核自动关闭
-
write
- 向已经打开的文件中写入数据
#include<unistd.h> ssize_t write(int fd, const void * buf, size_t count);
- 参数
- fd 文件描述符
- buf 待写入文件的数据的缓冲区,常量指针
- count 待写入的字节数
- 返回值
- 成功为已经写入的字节数,失败则返回-1
-
read
- 从已经打开的文件中读取数据
#include<unistd.h> ssize_t read(int fd, void*buf, size_t count);
- 参数
- fd 文件描述符
- buf 用于保存读取的字节
- count 要读取的字节数
- 返回值
- 成功为读取的字节数,失败返回-1
-
文件定位 & lseek
- 每个已经打开的文件都已一个“偏移量”
- 通常读写都是从文建偏移量开始,文件读写操作成功后,偏移量也会移动响应的读写字节数
- 调用lseek函数显示地定位一个已经打开文件的“偏移量”
#include<sys/types/h> #include<unistd.h> off_t lseek(int fd, off_t offsetm int whence);
- 参数
- fd 文件描述符
- offset 偏移量,现对于whence参数
- whence 指定偏移量相对于何处开始,可取3个常量值
- SEEK_SET 0 文件开始位置
- SEEK_CUR 1 文件读写指针当前位置
- SEEK_END 2 文件结束位置
- 返回值
- 成功返回当前去屑位置相对于文件头的偏移量,失败返回-1
- lseek经将当前的文件位移量记录在内核变量内,并不引起任何I/O操作