前言
今天是第24天,前面一直在写 C 语言和数据结构,今天转回 Linux 系统编程基础。Linux 是嵌入式 C 开发的主战场,内核、shell、常用命令、简单 shell 脚本,都是日常写代码、调试、编译必不可少的基本功。
一、操作系统与 Linux 内核
操作系统本质
操作系统本质是软件,用来屏蔽底层硬件差异,给上层程序提供统一接口。
Linux 内核五大核心功能
- 内存管理:管理系统内存分配、回收
- 多任务调度:CPU 时间片分配,进程调度
- 文件系统管理:Linux 哲学:一切皆文件
- 多任务间通信:进程之间数据交互
- 网络通信:网络协议栈
内核是纯 C 代码,用户不能直接和内核打交道。用户通过两种方式使用内核能力:
- 系统调用:内核原生接口,功能强,不可移植
- 库函数:对系统调用做封装,可移植,更易用
Shell 是什么
shell 是命令解释器,相当于用户和内核中间的外壳。用户输入 shell 命令,shell 解析后调用内核完成工作,保护内核不被用户直接操作。
二、Shell 常用命令
1. 文件目录操作
| 命令 | 作用 |
|---|---|
ls |
查看目录,ls -l 详细信息,ls -a 显示隐藏文件 |
touch |
新建普通文件 |
rm |
删除文件;rm -rf 强制删除目录 |
mkdir |
创建文件夹 |
rmdir |
删除空文件夹 |
cp |
复制,复制目录需要加 -r |
mv |
移动 / 重命名 |
ls 看到的第一位字符代表文件类型:
-:普通文件d:目录l:软链接b:块设备c:字符设备s:socket 套接字p:管道文件
2. 文件查看命令
cat filename:一次性全部输出文件内容,适合小文件more/less:分页查看大文件head/tail:看头部 / 尾部,tail -n 20 filename查看末尾 20 行
3. 文件查找
find . -name "文件名":在当前目录递归搜索文件grep "字符串" filename:在文件中匹配,打印包含该字符串的行
4. 通配符
*:匹配任意长度任意字符?:匹配单个任意字符[]:匹配括号内指定单个字符
bash
file_*.txt
file_??.txt
file_[1,3,5].txt
file_[1-5].txt
file_[^6].txt
5. 压缩解压 tar
bash
# 压缩 gz
tar -zcvf out.tar.gz dirname/*
# 压缩 bz2
tar -jcvf out.tar.bz2 dirname/*
# 解压 gz
tar -zxvf out.tar.gz
# 解压 bz2
tar -jxvf out.tar.bz2
6. 管道与重定向
-
管道
|:把前一条命令输出,当做后一条命令输入bashps -ef | grep "bash" -
重定向
>覆盖重定向,清空文件写入>>追加重定向,在文件末尾追加
bashps -ef > file.txt
示例综合练习:取头文件后 200 行,过滤 extern 写入文件
bash
tail -n 200 /usr/include/stdio.h | grep "extern" > file.txt
7. 其他高频命令
echo:打印内容到终端history:查看历史执行命令du:查看文件 / 目录大小,du -k/du -mod -c file.txt:按字符格式查看文件原始内容date:查看系统时间uname -a:查看内核、平台架构信息ifconfig:网卡信息ping:测试网络连通
8. 软件安装
-
dpkg 工具(deb 包本地安装)
bashsudo dpkg -i xxx.deb # 安装 sudo dpkg -P 软件名 # 卸载 dpkg -l 软件名 # 查看是否安装成功 -
apt‑get(联网源)
bashsudo apt-get install 软件名 sudo apt-get remove 软件名 --purge
三、Shell 脚本基础
编译型 vs 解释型
- 编译型语言 (C 语言):先全部编译成机器码,再运行;执行速度快,开发效率低。
- 解释型语言 (shell/python):边解析边执行;开发快,执行速度慢。
shell 脚本编写运行完整步骤
vim test.sh写脚本chmod +x test.sh添加可执行权限./test.sh运行脚本
shell 脚本本质:一堆 shell 命令的集合。
shell 变量
- 环境变量 :系统自带,例如
PWD、PATH - 位置变量
$0:脚本文件名$1$2$3:传入脚本第 1、2、3 个参数$#:传入参数总个数$$:脚本运行进程 PID$?:上一条命令返回值
- 自定义变量 :
变量名=值,等号两边不能空格
shell 引号区别
- 双引号
" ":解析里面变量,把变量替换成值 - 单引号
' ':原样输出,不解析变量 - 反引号
:把内部内容当做命令执行
输入输出、分支语句
read:读取终端输入if-then-elif-else-fi判断分支case多分支匹配
四、踩坑总结
- shell 脚本语法对空格极其敏感,
if、[]条件前后必须留空格。 - 脚本写完一定要加执行权限
chmod +x,否则不能./运行。 - 重定向
>和>>不要搞混,>会直接清空原有文件。 rm -rf谨慎使用,没有回收站,删除无法恢复。
小结
Shell 是 Linux 开发的基本功,写 Makefile、交叉编译、调试程序、批量处理文件都离不开。后面写 C 程序的时候,会高频使用这些命令。