Linux从入门到精通(入土)
- 结构体
a) 概念
结构体是一种构造数据类型,用于描述某一个信息,或者某一个物体构造的一种新的数据类型。结构体让C语言有了面向对象的思想。
b) 格式1
Struct 结构体名
{
数据类型 成员变量1;
数据类型 成员变量2;
……
数据类型 成员变量n;
}
注意: - 访问成员,用.降级访问。
- 结构体变量之间可以整体相互赋值,相同的成员之间可以相互赋值。
- 结构体成员不可能时函数,可以是:
a) 基本的数据类型。
b) 其他的结构体变量。
c) 指针:一级、二级、函数指针、数组指针、结构体指针。
d) 数组:一维数组、二维数组、函数指针数组。
结构体变量定义格式:
Struct 结构体名 变量名
结构体变量的初始化 - 先定义结构体类型,再定义变量
a) 定义的时候没有初始化,需要逐个成员赋初始值。
b) 定义时直接初始化,对应位置顺序赋值。
c) 点等法初始化 - 在定义结构体类型的同时定义变量(结构体定义再头文件下,main上)
- 和typedef结合使用
a) 先定义结构体类型再新起名。
b) 定义结构体类型的同时重新起名,可以省略结构体名。
c) 格式2:
struct
{
数据类型 成员变量1;
数据类型 成员变量2;
……
数据类型 成员变量n;
};
-
定义类型的同时定义变量,一般在嵌套结构体类型中。
-
结合typedef使用。
d) 结构体指针 -
定义格式:
Struct 结构体名 *指针变量名; -
访问结构体成员:
a)(*指针变量)成员变量名:先取整个结构体变量的值,然后用.降级访问成员。
b)指针变量->成员变量名:直接指针指向成员访问成员的值。
e) 结构体数组 -
定义格式:
Struct 结构体名 数组名[下标]。
2.结构体变量所占空间大小
一个结构体变量所占空间大小为所有成员对应类型开辟空间大小的总和。
但是,有对齐法则,以所有成员数据类型占用空间最大对齐开辟内存空间。32位操作系统最大以4byte对齐,64位操作系统,最大以8byte对齐。 -
共用体(联合体)
a) 概念:所有的成员公用一个内存空间,公用体开辟的内存。
空间大小是以占用空间最大的成员开辟。
b) 格式
Union 共用体名
{
数据类型 成员变量名1;
数据类型 成员变量名2;
……
数据类型 成员变量名n;
};
注意: -
共用体使用时同一时间使用一个成员的值。即初始化自己要使用的成员即可
-
共用体的定义格式和结构体类似,访问成员内容也用.降级访问。
-
由于公共体公用一个内存空间,不是很安全。即用共用体的使用相对与比较少。主要用共用体来测试pc大小端。
-
枚举
Enum (基本变量类型)
Stm32 linux驱动 QT中
#define MON 1
#define TUES 2
……
#define SUN 7
使用枚举类型表示一些常量
a) 格式
Enum 枚举名字
{
枚举成员1,
枚举成员2,
……
枚举成员n,
};//分号不可以省略
一般用枚举表示一些固定的值,比如,一周固定只用七天。
注意: -
枚举类型一旦定义,枚举中的成员值确定,枚举中的成员只能表示一个整数,默认第一个成员代表整数0,后边的成员依次累加1。
-
枚举中的成员使用逗号隔开。
-
可以给枚举中的某个成员指定一个初始值,某个成员后边的成员,在初始值的基础上加1。
-
当枚举类型定义成功后,枚举成员的值就已经确定,接下来使用时不能更改。
-
一般常用于和switch结合让代码更加直观清晰。
-
Linux和unix的区别
a) 两大区别 -
Linux是开发源代码的自由软件,而unix是对源代码实行知识产权保护的传统商业软件。
-
Unix系统大多是与硬件配套的,而Linux则可以运行在多种硬件平台上。
b) redhat和ubuntu的区别 -
redhat多用于服务器,更新不频繁,稳定。
-
ubuntu人道主义,界面优化比较好,跟新快,体验感好。
-
Linux体系架构
a)应用层:app shell
b)内核层:五大功能 -
文件管理
-
设备管理
-
网络管理
-
内存管理
-
进程管理
c) 硬件层:鼠标、键盘等。
C库:提供的一套标准的用于输入输出的函数接口,在不同的操作系统上都可以使用。间接的进行了系统调用
系统调用:内核向上提供输入输出函数接口,基于内核,函数接口只能在这个操作系统上使用。不同的操作系统提供的系统调用接口不同。 -
查看操作系统版本和内核版本
-
查看linux内核版本:unname -r/-a
-
查看ubunt的版本:lsb_release -a
-
关机或重启:shutdown
-
关机
a) 立即关机:sudo shutdown -h now
b) 定时关机:sudo shutdown -h +时间 -
重启
a) 立即重启1:sudo shutdown -r now
b) 立即重启2:reboot now
c) 定时重启:sudo shutdown -r +时间 -
环境变量
-
查看环境变量的命令:printenv或env
-
PATH:保存的是命令的默认查找路径,路径用:隔开。
-
若将自己写的可执行程序当命令使用:
a) 将可执行程序移动到PATH变量保存的路径中。
b) 将可执行程序存在的路径保存到PATH环境变量中。 -
Linux软件安装
-
了解不同系统安装软件的软件包类型:
系统 安装包类型
Windows .exe
Android .apk
Ubunt .deb
Redhead .rpm -
linux流行的软件包管理机制
a) debian Linux提出:deb软件包
b) redhead Linux提出:rpm软件包 -
deb软件包的分类
a) 二进制软件包:.deb
b) 源码包:.dsc -
软件包的管理工具:dpkg apt
Dpkg -
特点:安装软件需要安装软件的安装包存在,不能检测软件之间的依赖关系,不能从镜像站点获取软件包,安装不需要网络。
-
软件
仓库1(地址) 仓库2(网) 仓库3 仓库4
百度(源) 镜像站点 火狐 谷歌 -
命令:
a) sudo dpkg -i完整的软件名 :安装软件
b) sudo dpkg -r 软件名 :卸载软件
c) sudo dpkg -s 软件名 :查看软件的安装状态
d) sudo dpkg -p 软件名 :完全卸载
e) sudo dpkg -l 软件名 :列出软件的文件清单 -
软件包管理工具apt
格式:apt-一组命令:apt-get、apt-cache
特点:安装软件不需要软件的安装包存在,能检测软件之间的依赖关系,能从镜像站点获取软件包,安装需要网络。 -
apt-get 命令:安装、卸载
a) sudo apt-get install软件名:下载安装软件
b) sudo apt-get remove 软件名:卸载软件
c) sudo apt-get download 软件名:下载软件包
d) sudo apt-get source 软件名:下载源码包
e) sudo apt-get updata:更新软件源
f) sudo apt-get upgrade:更新所有软件
g) sudo apt-get clean:清楚下载的软件包
h) sudo apt-get check:检查系统中依赖关系的完整性。 -
apt-cache命令:查看安装状态、依赖关系
a) sudo apt-cache show 软件名:获取二进制软件包的详细描述信息
b) sudo apt-cache policy 软件名:查看安装状态
c) sudo apt-cache depends 软件名:我依赖的软件
d) sudo apt-cache rdepends 软件名:哪个软件依赖我 -
IP的分类
-
IPV4 32位 用点分十进制表示
192.168.50.14 C类IPV4 一个点前的数据是一个8bit(我们日常用IPV4 C 类就完全够用)
IPV4分类:五类
a) A类:一个字节网络号,三个字节的主机号。首位固定为0.
网段取值范围:0000 0000——0111 1111
一个网段能连接的主机台数:2^24-2
b) B类:2个字节网络号,2个字节的主机号。首位固定位10.
网段取值范围:1000 0000 0000 0000 -1011 1111 1111 1111
一个网段能连接的主机台数:2^16-2
c) C类:3个字节网络号,1个字节主机号。首位固定位110.
一个网段能连接的主机台数:2^8-1
d) 组播地址,首位固定位1110
e) 保留待用,首位固定为1111. -
认识shell
-
命令行解析器
-
Shell解析器版本:sh、csh、ksh、bash
-
Shell、内核、硬件、用户之间的关系:
a) 用户从命令行提示终端输入命令或者按键,提交给shell
b) Shell将命令转换位内核可以识别的指令
c) 内核驱动硬件设备实现对应指令功能,将执行结果提交给shell。
d) Shell将反馈的结果解释提交给用户识别。 -
shell基本命令
a) 历史记录查询:history
b) 命令起别名:alias -
Shell的特殊字符
-
通配符
a) a)*:匹配任意长度字符
b) b)?:匹配任意一个字符
c) c)[ - ]:匹配区间范围内的任意一个字符
d) d)[……]:匹配指定的任意一个字符
e) e)[^……]:匹配除指定字符的任意一个字符。 -
管道|
将一个命令作为另一个命令的输入。 -
wc命令
a) wc-l文件名:查看文件的行数
b) wc-w文件名:文件单词个数
c) wc-c 文件名:文件字符个数
d) wc-m文件名:文件大小 -
grep:查询文件中的字符串
grep “字符串” 文件名 -
输入输出重定向
a) a)>file:将file重定向为输出源,新建模式
b) b)>>file:将file重定向为输出源,追加模式
c) c)<file:将file重定向为输入源。
d) d)2>或&>file:将file文件重定向为错误信息输出源。 -
命令置换符:在Esc键下面
将一个命令的输出作为另一个命令的参数。 -
Shell基本系统命令
-
man:man man:查看man手册功能
-
sudo passwd 用户名:修改用户密码
-
su:切换用户
a) su:默认切换到root
b) sudo su 用户名:切换到指定用户
c) exit:退出切换的用户 -
data 查看系统的日期
a) sudo data -s 年/月/日
b) sudo data -s 时:分:秒 -
clear清屏
-
df-Th显示磁盘空间的使用情况
-
mount:挂载
挂载优盘方法
a) 将优盘插入电脑并在虚拟机中识别
b) 通过df-Th查看优盘的设备名称及文件类型
c) 执行sudo mount -t 文件类型 设备名称 挂载点
d) 卸载方法“sudo umount 挂载点 -
TFTP、nfs、samba服务器
安装TFTP文件传输服务器: -
检测电脑是否安装
Sudo dpkg -s tftpd -hpa -
安装
Sudo apt-get install tftp-hpa -
需要正确配置TFTP的配置文件来确保正常使用
Sudo vi/etc/default/tftp-hpa -
创建tftpboot目录
Sudo mkdir /hmoe/tftp
Sudo chmod 777 /home/tftp -
启动tftp服务
Sudo service tftpd-hpa restart -
测试客户端程序
Tftp localhost或tftp127.0.0.1(本机的ip地址)/对方的IP地址
输入命令:
Put a.c//上传文件
Get a.c//下载文件
q//退出
安装nfs服务: -
检测电脑是否安装
Sudo dpkg -s nfs-kernel-server -
安装
Sudo apt-get install nfs-kernel-server -
需要修改nfs的配置文件
Sudo vi/etc/exports文件
修改内容为:/home/hq/nfs -
重启服务:sudo service nfs-kernel-server restart
-
将/home/hq/nfs目录挂载到mnt下(192.168.1.107时虚拟机的ip)
Sudo mount-t nfs 192.168.1.107:/home/hq/nfs/mnt -
卸载:sudo umount/mnt
安装samba服务器: -
检测电脑是否安装
Sudo dpkg -s samba -
安装
Sudo apt-get install samba -
需要修改nfs的配置文件
Sudo vi/etc/samba/smb.conf -
用户管理命令
-
adduser创建用户
sudo adduser 用户名 -
usermod修改或添加用户
a) 修改:sudo usermod -l 新用户名 用户名
b) 添加:sudo usermod -aG 用户 组 -
删除用户
Sudo deluser 用户名 -
删除组
Sudo delgroup 组名 -
进程相关命令
进程:进程就是程序的一次执行过程。
程序:在磁盘空间上存放的可执行的二进制文件。 -
文件系统命令
-
文件系统类型
a) 磁盘文件系统:硬盘、U盘
b) 网络文件系统:nfs服务、samba
c) 虚拟文件系统:tmpfs
文件系统的格式有:ext、ext2、ext3、ext4、vfat、fat32 -
file文件名:查看文件的类型
a) a).elf 可执行文件类型
b) b).c
c) c).txt -
rm-f:强制删除,文件不存在都会删除。
-
cat 文件名:将文件内容输出到终端。
Cat-n 文件名:将文件内容及行号输出到终端。 -
head 文件名:默认输出文件内容前10行
head-num 文件名:将文件前num行内容输出到终端。 -
tail 文件名:默认输出文件内容最后的10行
tail-num 文件名:将文件后num行内容输出到终端。 -
硬链接和软链接
-
硬链接:通过文件的inode号创建的链接。硬链接文件不能跨越文件系统。
命令:in 文件名 链接文件名 -
软连接:通过绝对路径创建的链接,只要在这个路径下能找到对应的文件,链接就有效,相当于创建超链接。
命令:in -s 文件名 链接文件名
特点: -
如果时修改硬链接的目标文件名,链接依然有效。
-
如果修改软链接的目标文件名,则连接断开。
-
对于一个已存在的连接文件执行移动或删除操作,有可能导致链接的断开。假如删除目标文件后,重新创建一个同名文件,软链接将恢复,硬链接不再有效,因为文件的inode已经改变。
-
解压和压缩
-
gzip和gunzip
a) 特点: -
只能对单个普通文件进行压缩或解压。
-
不能进行归档,压缩后或解压后源文件都不存在。
-
压缩后生产压缩格式为.gz格式。
b) 压缩:gzip 文件名
c) 解压:gunzip 文件名.gz -
Bzip2和bunzip2(特点和gzip相似)
a) 压缩格式为:.bz2
b) 压缩:bzip2 文件名
c) 解压:bunzip2 文件名 .bz2 -
zip和unzip
a) zip功能:zip命令用于将一个文件或多个文件压缩成单一的压缩文件
b) zip格式:zip 压缩文件名 要压缩的文件列表
c) unzip功能:unzip命令用于将zip压缩文件进行解压
d) unzip格式:unzip 要解压的压缩文件。
注意:
a) 具有归档功能,并进行压缩
b) 可以压缩文件夹,后缀为.zip。压缩文件夹需要加 -r。
c) 压缩或者解压后源文件依然存在 -
xz和unxz(特点和gzip相似)
a) 压缩格式为:.xz形式
b) 压缩:xz 文件名.xz
c) 解压:unxz 文件名.xz -
Tar
-
选项:
a) -x:释放归档文件
b) -c:创建一个新的归档文件
c) -v:显示归档和释放的过程信息
d) -f:用户指定归档文件的文件名,否则使用默认名称,后跟文件名。
e) -j:由tar生成归档,然后由bzip2压缩
f) -z:由tar生成归档,然后由gzip
g) -J由tar生成归档,然后由xz压缩 -
注意:
a) 具有归档功能,并通过参数可以进行压缩或解压
b) 压缩或解压后源文件存在
c) 需要写全压缩或解压的文件名 -
格式:tar 选项 压缩(解压) 文件名 [要压缩的文件列表]
-
组合:
a) -cjf:以bz2的格式压缩文件
b) -czf:以gz的格式压缩文件
c) -cJF:以xz的格式压缩文件
注意:
jz 在f前:压缩后源文件依然存在
d)-xvf:解压一个压缩包:解压后压缩包依然存在。 -
Shell脚本
-
本质及特点
a) shell脚本的本质就是命令的有序集合。
b) shell脚本编程属于解释型语言,不需要编译。
c) shell脚本编程,就是将命令通过一定的逻辑顺序实现某些功能。
d) shell脚本文件的后缀时.sh -
写一个脚本文件的步骤
a) 创建一个脚本文件:touch xxx.sh
b) 将脚本文件权限修改为可执行
Chmod 777 xxx.sh
c) 编辑脚本内容:vi xxx.sh
d) 执行脚本文件:./xxx.sh或bash xxx.sh -
Shell变量
-
允许用户建立变量存储数据,但不支持数据类型
-
格式:变量名=值(注意:等号左右两侧不能有空格)
-
变量的分类
a) 用户自定义变量
b) 位置变量或命令行参数 -
$0 执行的脚本
-
$1-$9
-
${10} - ${N}
-
$#计算除执行脚本文件命令行参数个数
-
$@ $*遍历除脚本文件的所有命令行内容
c) 预定义变量 -
$?前一句命令执行的结果 0:真 ;非0:假。
-
$$ 进程pid
d) 环境变量 -
Shell中的语句
-
说明性语句
a) 以#开始到该行结束,不被解释执行
b) #!/bin/bash告诉操作系统使用哪种类型的shell执行此脚本文件。 -
功能性语句:任意的shell命令、用户程序或其他cx
-
结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句。
-
功能性语句
-
read(类似C语言的scanf-从终端输入)
格式:read var1 var2 var3
把读入行的第一个单词赋给var1,第二个赋给var2,以此类推。
Read-p “字符串” 变量列表:可以打印出字符串,并从终端输入。 -
expr算数运算命令expr主要用于进行简单的整数运算,包括:加、减、乘、整除和求模
注意:
a) 运算符左右两侧必须有空格
b) *和()必须加转义字符,*、()
c) Expr语句可以直接输出运算结果 -
let赋值运算
a) 在运算中不能有空格
b) 运算结果需要赋给一个变量
c) 变量参与运算的过程不用加$取值 -
Test语句:test语句可以测试三种对象:字符串、整数、文件属性
-
字符串的测试
a) s1=s2 测试两个字符串的内容是否完全一样
b) s1!=s2 测试两个字符串的内容是否有差异
c) -z s1 测试s1字符串的长度是否为0
d) -n s1 测试s1字符串的长度是否不为0 -
整数的测试
a) a -eq b 测试a与b是否相等
b) a -ne b 测试a与b是否不相等
c) a -gt b 测试a是否大于b
d) a -ge b 测试a是否大于等于b
e) a -lt b 测试a是否小于b
f) a -le b 测试a是否小于等于b -
文件属性的测试
a) -d name 测试name是否为一个目录
b) -f name 测试name是否为普通文件
c) -e name 测试文件是否存在 -
Shell中的结构性语句
-
if……then……fi语句
a) 基本结构:
If 表达式
Then
命令表
Fi
b) 分层结构:
If 表达式
Then
命令表1
Else
命令表2
Fi
c) 嵌套结构:
If 表达式
Then
命令表1
Else
If 表达式
Then
命令表
Fi
Fi
d) elif
if表达式1
then
命令表1
Elif 表达式2
Then
命令表2
Elif 表达式3
Then
命令表3
……
Else
命令表n
Fi
注意:如果表达式为真,则执行命令表中的命令;否则退出if语句,即执行fi后面的语句。
if和fi是条件语句的语句括号,必须成对使用;命令表中的命令可以是一条,也可以是若干条。 -
case语句
格式:
Case 字符串变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
……
模式n)
命令表n
;;
Esac
注意:
a) case语句只能检测字符串变量
b) 命令表以单独的双引号行结束,退出case语句
c) 模式n常写为字符*表示所有其他模式
d) Case匹配项中可以存在多个模式,每种模式之间用|隔开。 -
For……do……done循环格式:
For 变量名 in 单词表
Do
命令表
Done
注意: -
变量依次取单词表中的各个单词,每取一次单词,就执行一次。
-
循环体中的命令,循环次数由单词表中的单词数确定。
-
命令表中的命令可以是一条,也可以是由分号或换行符分开的多条。
For语句的几种书写格式 -
for I in 1 2 3 4 do……done:变量i从单词表中取值
-
for I do……done 变量i从命令行取值,可以省略in单词表
-
for I in{1…10} do……done:变量i从1-10个数中取值
-
for((i=0;i<10;i++)) do……done 书写格式类似C语言
-
While循环
格式:
While 命令或表达式
Do
命令表
Done
注意:while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。 -
Until循环
格式:
Until 命令或表达式
Do
命令表
Done
注意:until循环与while循环的功能相似,不同的是只有当测试的命令或表达式的值是假时,才执行循环体中的命令表,否则退出循环,这一点与while命令正好相反。 -
循环控制语句:break与continue
Break:结束本次循环
Break n:跳出n曾循环
Continue:结束本次循环继续下次循环
Continue n:转到最近n曾循环语句的下一轮循环上。 -
Shell数组
-
数组的定义及初始化
a) arr=(v1 v2 v3 v4)
b) arr=($1 $2 $3 4 ) c ) r e a d a b c a r r = ( 4) c) read a b c arr=( 4)c)readabcarr=(a $b $c)
d) read -a 数组名 -
访问数组
a) 取数组的某个元素: 数 组 名 [ 下 标 ] 0 b ) 对 数 组 元 素 的 值 进 行 修 改 : 数 组 名 [ 下 标 ] = 值 c ) 遍 历 数 组 : {数组名[下标]} 0 b) 对数组元素的值进行修改:数组名[下标]=值 c) 遍历数组: 数组名[下标]0b)对数组元素的值进行修改:数组名[下标]=值c)遍历数组:{数组名[@]}
d) 获取数组元素个数:${#数组名[@]}