目录
一、操作系统
1、描述
软件
管理计算机的硬件资源
为上层用户提供简单易用的接口
开源、免费、多用户
2、Linux操作系统的组件
1、 实用程序
图形化界面
管理程序
应用程序
编程工具
配置服务器
2、 Shell(命令解释器):起保护作用
命令解释器,实现用户月操作系统进行交互,位于实用程序与内核之间
3、 Linux的内核
内核是Linux系统的最底层,提供了系统的核心功能并预先进程以一种有序的方式访问硬件。
用于控制进程、输入、输出设备、文件系统操作、管理内存。
支持多用户(同时多个人用户访问系统),多任务(同时多个程序运行)
4、文件系统
一切硬件皆为文件
二、嵌入式系统
以应用为中心,软硬件结合,以计算机为基础,软硬件可裁剪
三、Linux的文件系统结构
在Linux中所有硬件都视为文件来处理
在Windows下,目录结构属于分区 。在Linux下,分区属于目录结构。
Linux的文件系统是一个树形的分层组织
/bin:二进制
/boot:linux系统启动时要用上的程序
/dev:包含所有Linux系统使用到的外部设备
/etc:存放了系统管理时要用到的各种配置文件和子目录
/lib:存放了系统动态链接共享库
/home:普通用户的主目录
/root:根目录(超级用户)的主目录
/user:
......
修改文件权限
- rw- rw- r--
普通文件 用户权限 同组用户权限 其他用户权限
chmod --修改权限
chmod 权限 文件 修改文件的权限
chmod 0777 文件 赋予文件最高权限,所有用户都可执行
eg:
chmod 0764 文件 u:rwx
g:rw-
o:r--
a:所有用户
chmod u/g/o/a + r/w/x 文件
chmod u/g/o/a + r/w/x 文件
创建链接文件
保留目标文件的地址,而不占
硬链接
利用Linux中为每个文件分配的物理编号——inode建立链接。因此,硬链接不能跨越文件系统。
源文件的镜像,里面保存的内容和源文件一模一样,大小也一样,一旦硬链接创建之后删除源文件,硬链接不会失效,且修改源文件的路径,硬链接也不会失效
ln 源文件名 硬链接名
软链接
(符号链接)是利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性。
源文件被删除或者路径改变,软链接都会失效
ln -s 源文件名 软文件名
注:一个扇区512个字节,一块有8扇共4MB
四、shell命令
1、shell命令格式
通常一条命令包含三个要素:命令名称、选项、参数。命令名称是必须的,选项和参数都可能是可选项。命令格式如下所示:
$ Command [-Options]Argument1 Argument2 ..指令选项′参数1
参数2...Command:命令名称,Shell命令或程序,严格区分大小写,例如设置日期指令为date等:
Options:命令选项,用于改变命令执行动作的类型,由“-”引导,可以同时带有多个选项;Argument:命令参数,指出命令作用的对象或目标,有的命令允许带多个参数。
注:一条命令的三要素之间用空格隔开;
若将多个命令在一行书写,用分号(;)将各命令隔开;
如果一条命令不能在一行写完,在行尾使用反斜杠(\)标明该条命令未结束。
2、shell特殊字符
1、通配符
通配符 | 含义 | 实例 |
* | 匹配任意长度字符串 | rm *.txt --删除.txt的文件 |
? | 匹配一个长度的字符 | rm ?.txt --删除一位字符的.txt文件 |
[..] | 匹配其中指定的字符 | 用file_[otr].txt。匹配file_o.txt、file_r.tx t和file_t.txt |
[-] | 匹配指定的一个字符范围 | 用file_[a-z].txt。匹配file_a.txt、file_b.txt。直到file_z.txt |
[^...] | 除了指定范围的字符,均可匹配 | a .txt b.txt c.txt d.txt e.txt f.txt rm [^abc ].txt//删除除了abc开头.txt文件 |
{ } | 可在创建文件时使用 | touch {a..z}.c --创建a~z的.c文件 |
2、管道 |
将一系列的命令连接起来,前一个命令的输出将作为后一个命令的输入,以此类推。。。
ls ~/class/shell/1.txt |wc -w ---查看目录文件的单词个数
3、输入输出重定向
重定向符 | 含义 |
>file | file输出,新建模式 |
>>file | file输出,追加模式(不会覆盖原有的内容) |
<file | 将file文件重定向为输入源 |
2>或&> | 将命令产生的错误信息输入到... |
ls ~ > 1.txt ---将1s ~查询到的内容存放到1.txt文件
注意:如果1.txt不存在则创建
如果1.txt存在则会清空,然后再放入重定向的内容
4、命令置换
命令command2的输出将作为命令command1的参数。需要注意,命令置换的单引号为ESC键下方的``键
command1 `comand2`
3、shell基本系统命令
1、echo (打印)
echo -n information 输出不换行
echo “字符串” 不会省略字符串中的重复空格
echo “$PATH 你好” --不会省略字符串的空格,但会引用环境变量
echo ' ' --不会省略字符串的空格,且不会引用环境变量
echo $SHELL ---查看当前终端使用的解释器类型
2、pwd命令
显示用户在文件系统中的当前位置(执行结果显示为绝对路径)
绝对路径:从根目录出发到目标文件的路径
相对路径:从当前位置到目标文件的路径
3、ls列目录内容
ls ---列出当前文件夹下的所有文件
ls-a ---显示当前目录全部文件(包括隐藏文件)
ls-l ---显示当前目录全部信息
4、man 与 info
获取联机帮助
可获得以下信息:(一般分为三页,第一页为命令/程序,第二页为系统调用函数,第三页为标准库函数)
命令的名称
命令的常用参数
命令的一边描述以及用途
命令的参数
用法示例等...
man commandname --模糊查找
info commandname
man -k "directory" ---关键字检索
5、关机与重启
sudo shutdown -h now --关机
sudo shutdown -r now --重启
sudo shutdown -h +1 --一分钟后关机
sudo reboot --重启
6、 passwd
修改已有账户的用户口令
7、df命令
df命令用于查看磁盘空间的使用情况。
df命令的一般格式为: df [-a 或 -T 或-h 或-k ] Filesystem
选项 | 含义 |
-a | 显示所有物理文件系统的使用情况,包括虚拟文件系统,如/proc,/sys等 |
-T | 显示物理文件系统的文件格式类型 |
-h | 物理文件系统大小按兆字节为单位显示 |
-k | 物理文件系统大小按千字节为单位显示 |
8、du命令
列出目录和文件所使用的磁盘块数,每块占512个字节。
常用参数:
-a:仅列出空闲的文件数
-k:列出磁盘的使用情况
-s:列出总的空闲空间
9、history
查询历史命令
echo $HISTSIZE ---查询保存历史命令的数量
临时修改保存命令数量
注:临时修改后关闭终端后再打开需要重新配置,要想长期使用可以前往用户终端配置文件里修改,用户终端的配置文件 ~/.bashrc
10、wc
wc -w 普通文件 --统计单词数
wc-l 普通文件 --统计行数
wc-c 普通文件 ---统计字节数
11、cat
cat 普通文件 //将文件内容输出到终端
cat -n 普通文件 //显示行号
12、more/less
more/less 普通文件 //分页查看普通文件的内容
h --帮助手册
空格 --向下翻页
回车 --翻行
13、grep
在文本中查找字符串
grep 选项 字符串 文件名 //在文件中查找字符串
选项: -n 显示行数
-r 在路径中找
注:Linux中c库函数头文件的路径/usr/include
14、head,tail
head 文件名 //从头开始显示文件
tail 文件名 //从尾部开始显示文件
15、sort
以行为单位,以字符ASCII码值为标准进行排序
sort 普通文件
sort -r 普通文件 //逆序排序
16、diff
比较两个文件
diff 普通文件1 普通文件2
a:add
d :delete
c: change
diff 1.txt 2.txt > 1.txt.patch
patch 1.txt 1.txt.patch ---根据.patch文件中的规则将1.txt更新为2.txt
17、file
查看文件类型 ————以文件的内容为标准
file 文件名
18、date
显示系统时间
date ———显示系统时间
19、who
查看当前接入系统的用户
20、in
创建文件链接
21、cp
总览
五、文件类型
文件类型 | 类型符 | 描述 |
普通文件 | - | 指ASCII文本文件、二进制可执行文件、以及硬件链接 |
块设备文件 | b | 块输入/输出设备文件 |
字符设备文件 | c | 原始输入/输出设备文件,每次I/O操作仅传送一个字符 |
目录文件 | d | 包含若干文件或子目录 |
符号链接文件 | l | 只保留了文件地址,而不是文件本身 |
命名管道 | p | 一种进程间通信的机制,用于进程间通信的暂时文件 |
套接字 | s | 用于进程间通信,两台计算机间通信的应用程序接口API |
六、文件的压缩与归档
归档--将一系列文件打包到一个文件中去
压缩文件也是将一组文件或目录保存一个文件中,并按照某种存储个数保存到磁盘上,所占磁盘空间比其中所有文件总和要少
du -h 文件名 查看文件占磁盘空间大小(-h 即以K、M、G为单位显示)
1、 文件的压缩
压缩工具 | 解压工具 | 文件扩展名 |
gzip | gunzip | .gz |
bzip2 | bunzip2 | .bz2 |
zip | unzip | .zip |
gzip [-l|-d|-num] filename
选项 | 描述 |
-l | 查看压缩文件内的信息,包括文件数、大小、压缩比等参数,并不进行文件解压 |
-d | 将文件解压,功能与gunzip相同 |
-num | 指定压缩比率,num为1-9级 |
2、文件的归档(打包)
tar --将多个文件或则目录打包为一个文件
-c 创建归档
-x 释放归档
-f 指定创建的归档文件名 一般为以.tar作为归档文件的后缀(不可省略,放在最后)
-v 显示归档和释放的过程
-z 在归档的同时进行gzip压缩
eg:
tar -cf 1.pdf.tar 1.pdf -- 为1.pdf文件创建归档(1.pdf.tar)
tar -xf 1.pdf.tar --释放归档
tar -cvf 1.pdf.tar 1.pdf -- 为1.pdf文件创建归档(1.pdf.tar)tar -xvf 1.pdf.tar --释放归档
tar -czvf 1.pdf.tar.gz 1.pdf -- 为1.pdf文件创建归档(1.pdf .tar)--在归档的同时进行压缩tar -xzvf 1.pdf.tar. gz -- --在释放归档的同时进行解压
七、Linux软件包管理
Linux软件包主要分为两类:Deb软件包、Rpm软件包
软件包的命名规则: Filename_Version-Reversion_Architecture.deb
软件包管理工具
1、离线管理工具:dpkg
dpkg -i 软件包名 (安装本地文件安装包)
eg: dpkg -r oneko_1.2.sakura.6-14_amd64.deb
dpkg -r 软件包名 (卸载)
eg: dpkg -r oneko
dpkg -P 软件包名(移除已安装软件包及配置文件)
eg: dpkg -P oneko
dpkg -L 软件包名 (列出安装的软件包清单)
dpkg -S 软件包名(显示出软件包的安装状态)
软件包名 运行软件
2、在线管理工具:apt
apt:获取、安装、编译、卸载、查询
需要虚拟机连接网络
APT软件包管理器在一个文件中列出可获得软件包的镜像站点地址,这个软件源配置文件就是/etc/apt/sources.list。它本质就是一个普通的文本文件,可以在超级管理员授权下,使用任何文本编辑器进行编辑。在该文件中,添加的软件源镜像站点称为一个配置项,并遵循以下格式:
DebType AddressType://Hostaddress/Ubuntu Distribution Component1 Component.....
软件配置文件 /etc/apt/sources.list
vi /etc/apt/sources.list ---访问软件配置文件
注:每次修改完/etc/apt/sources.list文件后,需要运行“apt-get update”命令,才会使更改有效!
apt-get工具
sudo apt-get update ---- 刷新软件源清单
sudo apt-get install 软件包名 ---- 安装相应软件包
eg:sudo apt-get install oneko
sudo apt-get remove 软件包名--- 卸载指定的已安装的软件包
eg:sudo apt-get remove cmatrixsudo apt-get clearn -- 清除缓存区所有软件包
sudo apt-get check 软件包名-- 检查系统中的依赖关系
sudo apt-get instal -d oneko --- 只下载oneko软件包不安装软件包位
于/var/cache/ apt/archives
sudo apt-get remove --purge 软件包名 ---与remove子命令一起使用,完全卸载软件包
sudo apt-get instal --reinstall 软件包名 --- 与insta11子命令一起使用,重新安装软件包
apt-cache
apt-cache show 软件包名 --获取二进制软件包的详细信息
apt-cache search 软件包名 --根据正则表达式检索软件包
apt-cache depends 软件包名 --获取软件包的依赖信息
apt-cache redepends 软件包名 --获取依赖于软件包的信息
apt-cache policy 软件包名 --获取软件包安装状态
注:寻找安装包的目录 --- /var/cache/apt/archives
八、网络配置
1、虚拟机配网
1、虚拟网卡
虚拟机编辑->虚拟网络编辑器->更改设置->桥接模式->选中windows主机正在工作的网卡
2、让虚拟机使用网卡
虚拟机->设置->网络适配器->自定义->选中上一步配置的网卡->确定
sudo service network-manager restart ---重启网络服务(刷新查看虚拟机联网图标)
ping www.4399.com --测试虚拟机能否连接网络
成功收到如下反馈:
2、网络映射
以太网映射 -->ens
无线网映射 -->wlan
linux查看网络 ifconfig
Windows查看网络 ipconfig
IP:在网络中唯一标识一台主机
IPv4 --4个字节
点分十进制
0-255,0-255,0-255,0-255
192.168.12.33
二进制
11000000 10101000 00001100 00100001
eg:
域名:www.4399.com
DNS:域名解释器,通过域名找IP
IPv6 --更多ip更安全
IP地址的范围
DHCP:IP租赁服务器,动态分配IP
配置静态IP:在主机进入网络之前,事先为主机设置固定的IP地址;
配置动态IP:选择DHCP网络服务,在主机进入网络之后,动态随机获取IP地址。
网络号(网段):子网掩码与IP地址按位相与
网络配置相关命令
ifconfig 查看网卡配置信息
ifconfig
sudo ifconfig ens33 192.168.12.77 mask 255.255.255.0
--将ens33网卡的IP地址设置为192.168.12.77 子网掩码设置为255.255.255.0
sudo ifconfig ens33 down --关闭ens33网卡
sudo ifconfig ens33 up --打开ens33网卡
netstat
netstat -apn 查看当前随机使用网络进程的详细信息
九、Linux系统用户管理
1、用户的属性
用户名、口令、用户ID(UID)“系统用一个整数来唯一标识一个用户”、用户主目录(HOME)、用户shell
/etc/passwd文件:系统能够识别的用户清单,用户登录时,系统通过查询这个文件来确定用户的UID并验证用户口令。
/etc/group:包含UNIX组的名称和每个组中的成员列表
一行代表一个组,包括4个部分:组名:加密的口令:GID号:成员列表(成员列表之间用逗号隔开)
2、切换用户
su 用户名 ——切换至指定用户
su ———切换至根目录
3、添加用户
语法:adduser <username>
添加新用户
sudo adduser 用户名 //新建一个用户 并且自动创建用户目录
添加新用户的过程:
sudo addusr 用户名 //新建一个用户并且自动创建用户目录(/home)/etc/adduser.conf
FIRST__UID=1000 //用户ID下限
LAST_UID=29999USERS_GID=100 //用户ID上限
DHOME=/home //新建用户目录存放位置
DSHELL=/bin/bash //新建用户的默认终端
SKEL=/etc/ske1 / /addusr新建的用户从此处加载配置文件
系统:编辑passwd和shadow文件,定义用户账号
设置一个初始口令
创建用户主目录,用chown和chmod命令改变主目录的属主和属性
用户操作:
将默认启动文件复制到用户主目录
设置用户的邮件主目录并建立邮件别名
4、修改用户属性
usermod -- 修改用户
eg: sudo usermod -d /home/lisi -m -l lisi zhangsan
--修改目录,同时修改用户名zhangsan为lisi
delgroup --删除组
sudo delgroup groupname
deluser --删除用户
sudo deluser 用户名 --删除指定用户,但是不会删除用户的目录
sudo deluser --remove -home 用户名 --删除用户名和目录
十、查找命令/程序的可执行文件的位置
which
which 命令/程序
whereis
whereis 命令/程序
十一、进程管理
程序的执行就是一个进程
ps --查看系统中正在运行的进程
ps -aux
ps-aux | grep " " --通过grep可快速找到需要的进程
kill --给进程发送信号
kill -l --查看系统支持的进程
kill -9 进程号 --杀死相应进程
进程状态
D: 不可中断的静止
R: 正在执行中
s: 阻塞状态
T∶ 暂停执行
Z: 不存在但暂时无法消除
<: 高优先级的进程
N: 低优先级的进程
L: 有内存分页分配并锁在内存中
十二、shell脚本
文件开头写上 #!/bin/sh
---说明文件是脚本,以及其解释器
1、编译性语言
需要c/c++编译器编译后才能执行
2、解释性语言
不需要编译,在运行使用解释器一边解释一遍运行
shell的本质:命令解释器
shell脚本的本质:shell命令的有序集合
3、shell编程过程
建议shell文件(一般是.sh为后缀)-->编写脚本文件-->赋予shell文件执行权限(chmod)-->执行shell脚本 ./xxx.sh 或者bash xxx.sh
注:用解释器执行脚本可以不用修改权限,如bash 1.sh或sh 1.s
4、shell变量
定义变量
(命名规则与c/c++一致)
变量名=字符串 (等号两边不能加空格)
shell会认为变量里面保存的内容都是字符串
引用变量
$变量名
eg: echo $var --打印变量var
变量清空
--unset 删除变量的里面保存的值
VAR=" hello world"
echo $VAR
unset VAR#清空变量echo $VAR
位置变量
$0与键入的命令行一样,包含脚本文件名
$1,$2,.…..$9 分别包含第一个到第九个命令行参数$#包含命令行参数的个数 -->不包含脚本文件名
$ @包含所有命令行参数:“$1,$2,......$9"$?包含前一个命令的退出状态
$*包含所有命令行参数:“$1,$2,.....$9"$$包含正在执行进程的ID号
注:0是正确,非0为错(shell)
环境变量
HOME : /etc/passwd文件中列出的用户主目录
IFS : Internal Field Separator,默认为空格,tab及换行符PATH : shell搜索路径
PS1,PS2:默认提示符($及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
export var = "hello" --新建一个环境变量
将脚本交给当前bash执行 ./1.sh
在当前bash中新建一个bash来执行脚本文件 bash 1.sh
各种引号的作业
" " --双引号
" "当中可以识别变量的引用->能够识别特殊字符
' '--单引号
' '当中可以识别变量的引用->不能够识剃特殊字符
` ` --反引号
` `将里面的命令执行结果保存起来
5、shell功能语句
shell程序由零或多条shell语句构成。shell语句包括三类:说明性语句、功能性语句和结构性语句。
说明性语句:
以#号开始到该行结束,不被解释执行
功能性语句:
任意的shell命令、用户程序或其他的shell程序
结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等
说明性语句(注释行)
注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面.以#号开始到所在行的行尾部分,都不被解释执行。
功能性语句
read
read var --从标准输入读入一行,并赋值给后面的变量
read var1 var2 var3 --把读入行中的第一个单词(word)赋给var1,第二个单词赋给var2 ,....…把其余所有的词赋给最后一个变量。
注:如果执行read语句时标准输入无数据,则程序在此停留等侯,直到数据的到来或被终止运行。
expr --算术运算命令
主要用于进行简单的整数运算,包括+(加)、-(减)、\*(乘)、/(整除)、%(求模)等
test
可测试三种对象: 字符串 整数 文件属性
字符串测试:
test "$var1" = "hello"
--变量var的值是否为字符串hello
test $num -eq 18
--变量num是否为整数
test -d tmp
--判断tmp是否为目录名
test s1 = s2
--测试两个字符串是否完全一样
test s1 != s2
--测试两个字符串的内容是否有差异
test -z s1
--测试s1字符串的长度是否为0
test -n s1
--测试s1字符串的长度是否不为0
整数测试:
test a -eq b 测试相等
test a -ne b 测试不等
test a -gt b 测试大于
test a -ge b 测试大于等于
test a -lt b 测试小于
test a -le b 测试小于等于
文件测试:
-d name 测试name是否为一个目录
-e name 测试一个文件是否存在
-f name 测试name是否为普通文件
-L name 测试name是否为符号链接
-r name 测试name文件是否存在且为可读
-w name 测试name文件是否存在且为可写
-x name 测试name文件是否存在且为可执行
-s name 测试name文件是否存在且其长度不为0
f1 -nt f2 测试文件f和是否比文件f2更新
f1 -ot f2 测试文件f是否比文件f2更旧
注:返回0则为真,返回非0则为假
结构性语句
条件语句 if...then...fi
语句结构:
if 表达式then 命令表
fi
注意: if[空格 判断条件 空格]
如果表达式为真,则执行命令表中的命令;否则退出if语句,即执行fi后面的语句。
if和fi是条件语句的语句括号,必须成对使用;
命令表中的命令可以是一条,也可以是若干条。
条件语句 if...then...else...fi
语句结构:
if 表达式
then 命令表1
else 命令表2
fi
如果表达式为真,则执行命令表1中的命令,再退出if语句;否则执行命令表2中的语句,再退出if语句.
多分支: if...then...elif...then...fi
语句结构:
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
fi
多路分支语句 case...esac
语句结构:
case 字符串变量 in
模式1)
命令表1
;;
模式2|模式3)
命令表2
;;
......
模式n)
命令表n
;;
esac
循环语句 for...do...done
格式:
for 变量名 in 单词表
do
命令表
done
------------------------------------------------------------------------------------------------------------------
注:变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是由分号或换行符分并的多条。如果单词表是命令行上的所有位置参数时,可以在for语句中省略“in单词表”部分。
循环语句 while...do...done
格式:
while 命令或表达式
do
命令表
done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再
测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。while语句的退出状态为命令表中被执行的最后一条命令的退出状态。
break和continue
break n --跳出n层
continue 语句则马上转到最近一层循环语句的下一轮循环上
continue n 则转到最近n层循环语句的下一轮循环上
6、shell函数
函数定义格式
方式一:
function_name()
{
command1
...
commandn
}
方式二:
function function_name()
{
command1
...
commandn
}
函数调用
方式1:
value_name= `function_name[arg1 arg2 ...]`
方式2:
function_name [arg1 arg2 ...]
echo $?
函数变量作用域
shell的函数里面定义的变量默认全局可用,要使其局部可用需要加locall
全局作用域:在脚本的其他任何地方都能够访问该变量
局部作用域:只能在声明变量的作用域内访问
声明局部变量格式:
local variable_name = value
十三、gcc编译器
1、gcc编译的过程
预处理 --->预处理之后的文件后缀 .i
编译 ---> .s
汇编 ---> .o(目标文件 二进制)
链接 ---> a.out
gcc -E 文件名.c //(预处理)删除注释
gcc -S 文件名.c //(编译)进行语法检查,将预处理后的文件编译成汇编文件
gcc -c 文件名.s //(汇编)将汇编文件转为二进制文件文件
gcc 文件名.o //(链接)将工程文件夹中所有目标文件链接在一起生产可执行程序
gcc test.c ---执行编译汇编链接所有操作,默认生产可执行文件名a.out
gcc -o 可执行文件名 编译文件.c --可定义生成的可执行的文件文件名
gcc -I 头文件路径 *.c //告知头文件所在路径
gcc -wall 打印文件中所有潜在的风险
2、gdb调试流程
首先使用gcc -g test.c进行编译,注意一定要加上选项‘-g'
#gcc-g test.c -o test
# gdb test
.
查看文件查看原文件的内容(gdb) 1 --默认显示十行,按回车健继续显示
设置点 (gdb) b 6查看断点情况 (gdb) info b
运行代码 (gdb) r