一、linux历史了解(安卓是在Linux系统上运行的系统,苹果是直接在Linux上运行)
二、linux系统结构(gcc -v查看Linux版本)
Linux的用户空间和内核空间互不进入。
用户空间 应用程序:shell(系统命令) shell脚本 工具软件
内核空间 操作系统内核:
(1)系统调用 是系统提供给用户程序的接口
(2)文件系统IO内存管理,进程管理,中断异常处理,设备驱动等
2.Linux的文件系统:
文件系统:专用于管理,存储文件的一个程序,是系统内核的一个组件。
文件本身的存储需要有存储介质: 机械硬盘,磁道,扇区
固态硬盘:使用浮栅晶体管来存储数据,稳定性好,PCIE接口,
光盘,hd代表IDE硬盘,sd代表SATA硬盘/dev/sda表示第一个硬盘/dev/sdb表示第二个硬盘,
读写接口:SATA PCIE M.2
3.文件系统种类:df -h(查看文件系统)
本地文件系统:存储介质就在本机磁盘上
网络文件系统:存储介质在网络上 网吧
虚拟文件系统:存储介质不存在或者在内存上(tmp是临时文件系统,一旦掉电文件就会不存在)
4.文件系统格式:
NTFS:windows 主流
exFAT FAT16 FAT32 兼容文件系统格式
ext4,ext3,ext2 linux主流
5.
文件系统最小读写单元: 4K
文件占用磁盘的大小 du -h 文件名
查看linux的文件系统结构 sudo fdisk -l
sudo: 表示后面的指令使用管理员权限执行(一段时间内只需要输入一次密码)
三、linux系统的目录结构
1.命令
/ 根目录 类似于Windows中C盘
/bin 系统的可执行文件 命令或可执行程序
/dev 系统设备文件(在Linux系统中认为一切皆文件)
(*)/etc 系统配置文件或服务的目录
/home 用户的家目录
/ lib 系统库文件目录
(#)/media Ubuntu图形界面自动挂载临时文件
/mnt 系统挂载点目录
/opt 系统应用程序安装包存放位置 类似于Windows中program files(x86)
/proc 一个虚拟的文件系统路径,用于查看系统中的程序运行状态等信息(只读)
2.Linux文件命名严格区分大小写,windows文件命名不需要区分大小写
例如if.txt和IF.txt
linux 是两个文件,Windows会认为是同一个文件。
3.Linux路径分隔符/ windows \
四、shell命令的一般格式
命令 [-选项] [参数](若要在一行输入多个命令可以用" ; "换行输入" \")
table 补全命令 双击table 弹出可能的备选项
alias 取别名 eg:(alias ls='ls --color=auto')unalias 删除别名(unalias命令别名)
CTRL + r 寻找历史命令
shell中的符号:
(1)通配符:使用一些特殊符号 代指某些情况或字符
* 代指匹配 任意长度 任意字符
? 匹配任意1个字符长度的字符
[] 选择匹配1个长度的字符
[-] 选择匹配一定范围的1个长度字符
[^] 选择匹配不是该范围的1个字符长度
(2) | 管道符: 连接两个命令,将前一个命令的输出作为下一个命令的输入
wc 统计命令 用于统计字符或字符串
wc -w 统计输入字符串中单词的个数(使用''分割)
wc -l 统计输入字符串中'\n'的个数即行数
grep 命令:用于查找输入的字符串(grep " ")
eg: cat 文件 | grep "main"
^在grep中代表开头(grep "^ ")
$在grep中代表末尾 (grep " $")
grep "目标字符串" 文件名 -n
打印目标文件中的目标字符串并显示行号
在指定目录以及目录内,查找文件名
名字可以使用shell通配符
find -name
find ./ -name "[0-9]*.c"
(3)转义符 \(反斜杠) 将原本有特殊意义的转义为正常字符也可以将原本正常字符转义为特殊功能字符
'\r' '\n' '\0' \\代指'\' (并不是什么都可以转义)
(4)目录符 /(斜杠)目录分隔符 该符号不能转义
(5)输入输出重定向符
输出重定向
> 覆盖模式
>> 追加模式
输入重定向
<
使用场景:程序的错误输出保存到文件
2> 错误输出重定向 stderr中输出
> 所有输出重定向
1> 正确输出重定向 printf(); stdout
echo "字符串" 在中断输出字符串
eg: echo "hello world"-->hello world
输入重定向
从文件中读取内容作为命令的输入
(6)`shell命令`(table键的上面那个键) 命令置换
将``中的命令的输出作为其它命令的参数,主要用于shell脚本编程中
(7)更多的命令
mkdir -p 递归创建目录 ./a/b/c
chmod: 改变文件或目录的访问权限
chmod 0600 a.txt 0600是一个3位的8进制数,表示每组的权限rwx
chown: 改变文件或目录的属主
sudo chown root a.txt
chgrp: 改变文件或目录所属的组
sudo chgrp root a.txt
cat: 显示文本文件
less/more: 分屏显示文件
ln: 创建文件链接 绝对路径与相对路径的异同
ln -s 源文件 目标文件 软连接
ln 硬链接
head: 显示文件开头(默认打印前10行)head -20 文件名(打印前20行)
tail: 显示文件末尾(与上同)
diff: 比较两个文件(>表示左边文件多了..<表示右边文件多了..)
file: 查看文件类型(Linux系统识别文件类型是靠文件内容,但gcc要加.c)
date: 显示时间和日期
gzip: 压缩文件(只能压缩一个文件,变小)
tar: 归档压缩(可以压缩多个文件,变小)
示例: tar -cvzf test.tar.gz ./*
创建压缩文件 -cvzf 压缩包名 要压缩的文件或目录
解压缩 tar -xvf test.tar.gz
echo: 显示文本
用户相关的命令:
adduser 新用户名 添加用户
deluser 用户名 删除用户
su 用户名 切换用户
修改用户属性(本质是修改/etc/passwd文件)
usermod -d 修改用户家目录的位置(前提新家目录存在) 用户名 -m
示例: sudo usermod -d abc stu -m
sudo vipw -p 修改passwad密码文件配置
进程相关命令:
ps -aux 查询当前系统中有哪些进程在运行
top 动态显示运行进程
kill 发送信号给进程
发送杀死信号某个进程(-9)
kill -9 PID
{
ctrl + z 将正在运行的前台进程放到后台
[1]+ 已停止 ./a.out
bg 1 让后台暂停的任务继续运行
fg 任务号 将后台任务切换到前台
}
进程优先级设置命令
renice 优先级 PID +优先级降低,-优先级升高
软件包管理器:
Linux软件包格式:
sogoupinyin_4.0.1.2800_x86_64.deb
包名 主版本号 次版本号 cpu架构
软件包管理器:
dpkg 本地软件包管理器
apt 联网软件包管理器
查看本机安装的软件包
dpkg -l
dpkg -l | grep "sogou"
卸载本地软件包
dpkg -r 包名
卸载软件包 及其配置文件
dpkg -p 包名
安装本地软件包
dpkg -i 软件包.deb
dpkg 相关命令
dpkg -i <package> 安装一个在本地文件系统上存在的Debian软件包
dpkg -r <package> 移除一个已经安装的软件包
dpkg -p <package>移除已安装软件包及配置文件
dpkg -l <package>列出安装的软件包清单
dpkg -s <package>显出软件包的安装状态
dpkg -reconfigure <package> 重新配置一个已经安装的软件包
联网软件包管理
apt-get install 包名
apt软件源列表
服务器地址列表文件 /etc/apt/source.list
apt与dpkg区别:
dpkg主要在离线模式安装,但不能自动处理依赖
apt在线安装,可以自动处理依赖问题
网络相关命令:
网络相关常识:
基于IP地址的网络模式
IP地址:本质是一个数
IPV4 :32bit的数 0- 2^32-1
IPV6 : 128bit的数
IP书写格式:点分法 4段式 8bit.8bit.8bit.8bit
域名:给知名的IP命名 (域名服务器)
IP的分类:
A 第一个字节固定,后面的网络地址可变
B 前两个字节固定,后面的网络地址可变
C 例如:192.168.....
路由器:
交换机:可以将很多根网络线互相连通
查看本机IP
ifconfig
网络联通性测试命令:
ping IP
hostname
nslookup 查询DNS域名对应的IP
验证网络的DNS配置是否可用
网络的配置:
{
[(/etc/network/interfaces)网卡配置]
DHCP:自动分配IP 路由器一般DHCP服务
静态IP:电脑直接定义一个IP使用 可能与当前网络中的其它主机的IP冲突
若要设置静态IP:192.168.3.200 - 192.168.3.254
方法1:通过图形界面配置
方法2:通过修改配置文件
sudo vim /etc/network/interfaces
停止图形界面的网络托管服务
sudo /etc/init.d/network-manager stop
重启网卡
sudo /etc/init.d/networking restart
TFTP服务器:类似于网盘
客户端与服务器模式(cs)一个用于上传与下载文件的服务器
TFTP客户端与服务器安装:(连接,上传,下载)
(1)安装
sudo apt-get install tftp
sudo apt-get install tftpd-hpa
查看安装是否成功
dpkg -l |grep "tftp"
(2)配置
配置工作目录前先在家目录 创建一个tftp服务器的工作目录
mkdir /home/xwq/tftpboot
将该工作目录权限修改为 777
sudo chmod 777 /home/xwq/tftpboot
sudo vim /etc/default/tptfd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
修改为
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/xwq/tftpboot" //修改工作目录
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure -c" // 允许服务器创建文件 即客户端可以上传文件到服务器(3)重启tftp服务
sudo /etc/init.d/tftpd-hpa restart
[ ok ] Restarting tftpd-hpa (via systemctl): tftpd-hpa.service.
(4)在本地验证服务器能否使用
客户端链接服务器:
tftp 192.168.3.119
tftp>
上传文件到服务器
tftp> put 本地的文件名
示例:
tftp> put q.txt
Sent 304315 bytes in 0.1 second
退出客户端
tftp> quit
客户端下载文件:
tftp> get q.txt
Received 304315 byts in 0.01
nfs服务器: 文件共享的服务器 可以将目录共享与其他电脑使用
(1)安装nfs服务器 (可以查看目录等)
sudo apt-get install nfs-kernel-server
客户端安装
sudo apt-get install nfs-common
(2) 编辑配置文件
sudo vim /etc/exports
在最末尾 添加一行配置
/home/xwq/nfshome *(rw,sync,no_subtree_check)
/home/xwq/nfshome: nfs工作目录 若没有 新建一个 权限设置 777
*: 任意IP可以访问nfs
(rw,sync,no_subtree_check): 访问权限 rw 可读可写
(3)重启服务
sudo /etc/init.d/nfs-kernel-server restart
[ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.
(4)使用nfs
使用mount挂载的方式将nfs
1.客户端临时创建一个挂载点 通常 /mnt/nfs
2.挂载
sudo mount 192.168.3.119:/home/xwq/nfshome /mnt/nfs
nfs服务器IP: 服务器共享目录路径 挂载到本地的路径
3.卸载
sudo umount /mnt/nfs
}
shell脚本:一种解释性编程语言
(将多行shell命令有序存放于文件中,有shell解释器/bin/bash 逐条读取命令执行)
多用于做命令控制,批量处理等操作,运行效率不高
shell脚本格式:
1、文件通常 .sh(用做说明,没有强制性要求)
2、文件第一行 #!/bin/bash 指定解释器
3、写代码,保存并退出 wqa
4、给shell脚本 赋值可执行权限
chmod 766 xx.sh
5、./xx.sh(运行) 或者(指定解释器去解释) /bin/bash hello.sh
创建一个写脚本框架的脚本
#!/bin/bash
touch a.sh
echo "#!/bin/bash" > a.sh
chmod 766 a.sh
vim a.sh
shell脚本注意事项:
1、每一行就是一个shell命令
2、编写规范与shell命令规范是一致的
3、严格使用标点符号 包括空格
shell变量:弱变量类型
1、用户自定义变量
2、位置变量
3、预定义变量
4、系统保留的变量
变量不需要指定类型 一切变量皆认为字符串
(1)用户自定义变量定义
变量名=值
引用变量名 :
$变量名(变量名也不能有空格和c语言命名类似)
shell变量引用的本质就是字符串替换
unset 变量名 删除变量名
(2)位置变量:
shell脚本在运行时给定的参数或选项 将通过位置变量进行传递
不需要定义
$0 shell脚本名及路劲
$1 第一个选项或参数
$2 第二个选项或参数
..
$9 第九个选项或参数
(3)预定义变量:
$# shell脚本执行时参数的个数
$@ 包含所有参数
$* 包含所有参数
$? 是上一个命令执行时的退出值
$$ 执行进程的ID
(4)系统保留的变量 环境变量:
终端启动时,终端定义了一些变量且赋值了一切
shell中的输入与输出:
输出echo "输出内容 可以使用变量"
输入read 变量名1 变量名2 变量名3
shell区分输入内容 以空格作为分隔符
算数运算 expr 算数表达式
示例 expr 3 + 2 - 5 \* 0
shell中的条件表达式:
单独字符串 有字符即 真 无字符'\0'即为假
字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
整数测试
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
note: test语句执行成功(满足条件) 返回结果0 失败返回1
-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 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
表达式非操作
!表达式
shell中的 if结构:
选择分支(空格不能省)
if [ 条件表达式 ]
then
命令块 条件真时执行
fi
二分支结构
if [ 条件表达式 ]
then
命令块 条件真时执行
else
命令块 条件假时执行
fi
练习:写一个shell脚步,运行时输入文件名参数,
判定文件是否为空文件,若空则删除这个文件
表达式的关系运算 && || !
if [[ -e $1 ]] && [[ ! -s $1 ]]
多分支结构: case 结构
结构:
case 变量 in
字符串1)
命令块1
;;
字符串2)
命令块2
;;
...
*)
命令块n
;;
ecac
运行逻辑:
将变量(字符串)与 in 后的字符串进行相等比较
若相等则执行后续的代码块 直到 ;;
*)可以匹配任意字符
shell循环:
while结构:
while [ 命令或表达式 ]
do
命令表
done
运行逻辑:命令或表达式为真则循环执行命令表
直到为假退出
for 结构1:与C语言中的for类似
i=1
for (( i=1; i<10; i++ ))
do
touch "file$i.txt"
done
for 结构2:
for 变量名 in 参数表
do
循环体
done
运行逻辑:
第一次循环从参数表中取第一个值作为变量的值
进行一次循环
第二次循环 从参数表中取第二个值作为变量的值
进行一次循环
...
直到参数表中所有的值都被取出时循环结束
参数表:可以是多个变量 也可以是多个单词
#调用函数
f1 # 没有参数的函数调用
sum 10 20 # 函数调用 带参数
B=$? # 得到函数中return 返回的值
echo "函数sum的返回值 $B"
OUT=`sum 10 20` # 命令置换方式调用 得到函数的输出
echo "函数sum的输出:$OUT"
local 变量 局部变量
默认是全局变量