外观
01.Shell常用指令与面试题整理
约 3298 字大约 11 分钟
脚本Shelllinux个人
2025-06-20
一、基础操作指令
1.1 文件与目录操作
# 列出文件
ls -la # 详细列出所有文件(包括隐藏文件)
ls -lh # 人性化显示文件大小
ls -lt # 按时间排序
# 目录操作
pwd # 显示当前目录
cd ~ # 返回家目录
cd - # 返回上一个目录
mkdir -p dir1/dir2 # 创建多级目录
rmdir dir # 删除空目录
# 文件操作
touch file.txt # 创建空文件或更新时间戳
cp -r source dest # 递归复制目录
mv file1 file2 # 移动或重命名
rm -rf dir # 强制递归删除(谨慎使用)1.2 文件查看与编辑
# 查看文件内容
cat file.txt # 显示整个文件
head -n 20 file.txt # 显示前20行
tail -n 20 file.txt # 显示后20行
tail -f log.txt # 实时查看日志
# 分页查看
more file.txt # 分页查看(只能向下)
less file.txt # 分页查看(可上下翻页)
# 文本处理
grep "pattern" file.txt # 搜索文本
grep -r "pattern" dir/ # 递归搜索
grep -i "pattern" file.txt # 忽略大小写
grep -v "pattern" file.txt # 反向匹配1.3 文件权限与属性
# 权限管理
chmod 755 file.sh # 设置权限(rwxr-xr-x)
chmod u+x file.sh # 给所有者添加执行权限
chown user:group file.txt # 改变所有者和组
chown -R user:group dir/ # 递归改变
# 文件属性
stat file.txt # 显示文件详细信息
file program.bin # 检测文件类型二、进程管理指令
2.1 进程查看与控制
# 进程查看
ps aux # 显示所有进程详细信息
ps -ef # 显示完整格式的进程信息
ps -u username # 查看特定用户的进程
ps aux --sort=-%cpu # 按CPU使用率排序
ps aux --sort=-%mem # 按内存使用率排序
# 实时监控
top # 实时显示进程状态
htop # 增强版top(需安装)
top -p pid1,pid2 # 监控特定进程
# 进程控制
kill -9 pid # 强制杀死进程
killall process_name # 杀死所有同名进程
pkill -f pattern # 根据模式杀死进程2.2 后台任务管理
# 作业控制
command & # 后台运行
jobs # 查看后台作业
fg %1 # 将作业1调到前台
bg %1 # 将作业1调到后台继续运行
ctrl + z # 暂停当前作业
# nohup与disown
nohup command & # 退出终端后继续运行
disown -h %1 # 使作业与终端分离三、系统信息与监控
3.1 系统状态
# CPU信息
cat /proc/cpuinfo # CPU详细信息
lscpu # CPU架构信息
uptime # 系统运行时间和负载
# 内存信息
free -h # 人性化显示内存使用
cat /proc/meminfo # 内存详细信息
vmstat 1 # 每秒显示虚拟内存统计
# 磁盘信息
df -h # 显示磁盘空间使用
du -sh dir/ # 显示目录大小
du -h --max-depth=1 # 显示一级子目录大小
# 系统信息
uname -a # 显示所有系统信息
cat /etc/os-release # 显示发行版信息
hostname # 显示主机名3.2 性能监控
# IO监控
iostat -x 1 # 显示IO统计
iotop # 实时IO监控(需安装)
# 网络监控
netstat -tulpn # 显示网络连接和端口
ss -tulpn # 更快的netstat替代
lsof -i :8080 # 查看8080端口被谁占用
# 综合监控
dstat # 综合监控工具
sar # 系统活动报告四、网络操作指令
4.1 网络配置与诊断
# 网络配置
ifconfig # 显示网络接口信息(旧)
ip addr show # 显示IP地址(新)
ip route show # 显示路由表
# 网络诊断
ping host # 测试连通性
ping -c 4 host # 发送4个包
traceroute host # 追踪路由路径
mtr host # 更强大的traceroute
# 端口测试
telnet host port # 测试TCP端口连接
nc -zv host port # 测试端口是否开放4.2 网络下载与传输
# 下载工具
wget url # 下载文件
wget -c url # 断点续传
curl url # 更强大的下载工具
curl -o file.txt url # 保存为文件
# 网络传输
scp file.txt user@host:/path # 安全复制
rsync -avz source/ user@host:/dest # 同步文件五、文本处理三剑客
5.1 grep(文本搜索)
# 基础搜索
grep "pattern" file
grep -E "pattern1|pattern2" file # 扩展正则
grep -P "pattern" file # Perl正则
# 上下文显示
grep -B 2 "pattern" file # 显示匹配前2行
grep -A 2 "pattern" file # 显示匹配后2行
grep -C 2 "pattern" file # 显示匹配前后各2行
# 文件操作
grep -l "pattern" *.txt # 只显示文件名
grep -L "pattern" *.txt # 显示不匹配的文件5.2 sed(流编辑器)
# 替换操作
sed 's/old/new/g' file # 全局替换
sed -i 's/old/new/g' file # 直接修改文件
sed 's/old/new/2' file # 替换每行第2个匹配
# 删除操作
sed '/pattern/d' file # 删除匹配行
sed '1,5d' file # 删除1-5行
sed '$d' file # 删除最后一行
# 其他操作
sed -n '5,10p' file # 打印5-10行
sed '/pattern/a\text' file # 在匹配行后添加文本5.3 awk(文本分析)
# 基础用法
awk '{print $1}' file # 打印第一列
awk -F: '{print $1}' /etc/passwd # 指定分隔符
awk '$3 > 1000' file # 过滤第三列大于1000的行
# 计算功能
awk '{sum+=$3} END{print sum}' file # 求和
awk '{print NR, $0}' file # 添加行号
# 条件处理
awk '/pattern/ {print $0}' file # 匹配模式
awk 'BEGIN{FS=":"; OFS="\t"} {print $1,$3}' file # 设置分隔符六、压缩与归档
# tar命令
tar -cvf archive.tar dir/ # 创建tar包
tar -xvf archive.tar # 解压tar包
tar -czvf archive.tar.gz dir/ # 创建gzip压缩包
tar -xzvf archive.tar.gz # 解压gzip包
tar -cjvf archive.tar.bz2 dir/ # 创建bzip2压缩包
tar -xjvf archive.tar.bz2 # 解压bzip2包
# zip/unzip
zip -r archive.zip dir/ # 创建zip压缩包
unzip archive.zip # 解压zip包
# gzip/bzip2
gzip file.txt # 压缩文件
gunzip file.txt.gz # 解压gzip文件
bzip2 file.txt # 压缩文件
bunzip2 file.txt.bz2 # 解压bzip2文件七、嵌入式开发常用指令
7.1 交叉编译相关
# 交叉编译工具链
arm-linux-gnueabi-gcc -v # 查看交叉编译器版本
which arm-linux-gnueabi-gcc # 查找交叉编译器路径
# Makefile相关
make -j4 # 4线程并行编译
make clean # 清理编译文件
make distclean # 深度清理
make menuconfig # 内核配置界面7.2 系统调试
# 内核信息
dmesg # 查看内核日志
dmesg -T # 带时间戳的内核日志
dmesg -w # 实时查看内核日志
cat /proc/version # 内核版本
cat /proc/cmdline # 内核启动参数
# 硬件信息
lsusb # USB设备列表
lspci # PCI设备列表
lsmod # 已加载模块
modinfo module_name # 模块信息7.3 嵌入式文件系统
# 挂载操作
mount -t nfs host:/path /mnt # 挂载NFS
mount -o loop image.img /mnt # 挂载镜像文件
umount /mnt # 卸载
# Flash操作
flash_eraseall /dev/mtd0 # 擦除MTD设备
nandwrite /dev/mtd0 image.bin # 写入NAND
# 文件系统工具
mkfs.ext4 /dev/sda1 # 创建ext4文件系统
fsck.ext4 /dev/sda1 # 检查ext4文件系统7.4 嵌入式调试工具
# strace调试
strace command # 跟踪系统调用
strace -p pid # 跟踪运行中的进程
strace -c command # 统计系统调用
# ltrace调试
ltrace command # 跟踪库函数调用
# 内存调试
valgrind --leak-check=full ./program # 内存泄漏检查八、Shell脚本编程
8.1 变量与参数
# 变量定义
name="value"
readonly name # 只读变量
unset name # 删除变量
# 特殊变量
$0 # 脚本名
$1, $2, ... # 位置参数
$# # 参数个数
$* # 所有参数
$@ # 所有参数(带引号)
$? # 上一个命令的退出状态
$$ # 当前进程PID
$! # 最后一个后台进程PID8.2 条件判断
# 文件测试
[ -f file ] # 文件存在且为普通文件
[ -d dir ] # 目录存在
[ -e path ] # 文件/目录存在
[ -r file ] # 文件可读
[ -w file ] # 文件可写
[ -x file ] # 文件可执行
# 字符串比较
[ "$str1" = "$str2" ] # 字符串相等
[ "$str1" != "$str2" ] # 字符串不等
[ -z "$str" ] # 字符串为空
[ -n "$str" ] # 字符串非空
# 数值比较
[ $num1 -eq $num2 ] # 等于
[ $num1 -ne $num2 ] # 不等于
[ $num1 -gt $num2 ] # 大于
[ $num1 -lt $num2 ] # 小于
[ $num1 -ge $num2 ] # 大于等于
[ $num1 -le $num2 ] # 小于等于8.3 流程控制
# if语句
if [ condition ]; then
commands
elif [ condition ]; then
commands
else
commands
fi
# for循环
for i in {1..10}; do
echo $i
done
for file in *.txt; do
echo $file
done
# while循环
while [ condition ]; do
commands
done
# until循环
until [ condition ]; do
commands
done
# case语句
case $var in
pattern1)
commands
;;
pattern2)
commands
;;
*)
commands
;;
esac九、面试常问指令与问题
9.1 高频面试指令
# 1. find命令高级用法
find /path -name "*.c" -type f # 查找.c文件
find . -mtime -7 # 查找7天内修改的文件
find . -size +10M # 查找大于10M的文件
find . -perm 644 # 查找权限为644的文件
find . -exec grep -l "pattern" {} \; # 查找包含内容的文件
# 2. 管道和重定向
command1 | command2 # 管道
command > file # 输出重定向(覆盖)
command >> file # 输出重定向(追加)
command 2> error.log # 错误重定向
command &> all.log # 所有输出重定向
command < input.txt # 输入重定向
# 3. sort和uniq
sort file.txt # 排序
sort -r file.txt # 反向排序
sort -n file.txt # 数值排序
sort -u file.txt # 去重排序
uniq file.txt # 去除连续重复行
sort file.txt | uniq -c # 统计出现次数
# 4. cut和paste
cut -d: -f1 /etc/passwd # 以:分隔取第一列
cut -c1-5 file.txt # 取1-5字符
paste file1 file2 # 合并文件列
# 5. tr命令
tr 'a-z' 'A-Z' < file.txt # 小写转大写
tr -d '\n' < file.txt # 删除换行符
tr -s ' ' < file.txt # 压缩连续空格9.2 面试常见问题
如何查看文件的第10行?
sed -n '10p' file.txt head -10 file.txt | tail -1 awk 'NR==10' file.txt如何统计文件行数、单词数、字符数?
wc -l file.txt # 行数 wc -w file.txt # 单词数 wc -c file.txt # 字符数 wc file.txt # 全部显示如何实时监控日志文件?
tail -f logfile less +F logfile如何查看进程打开的文件?
lsof -p pid ls -l /proc/pid/fd如何查找包含特定文本的文件?
grep -r "text" /path find /path -type f -exec grep -l "text" {} \;如何查看磁盘使用率最高的目录?
du -h --max-depth=1 | sort -rh | head -10如何杀死所有名为"test"的进程?
pkill test killall test ps aux | grep test | awk '{print $2}' | xargs kill -9如何比较两个文件的不同?
diff file1 file2 vimdiff file1 file2如何查看CPU使用率最高的进程?
ps aux --sort=-%cpu | head -10 top -b -n 1 | head -20如何将命令输出同时显示在屏幕和文件中?
command | tee output.txt command 2>&1 | tee output.txt
9.3 嵌入式开发面试问题
如何查看嵌入式系统的内存使用情况?
cat /proc/meminfo free top如何调试内核崩溃问题?
dmesg cat /proc/kmsg如何查看中断统计?
cat /proc/interrupts如何查看系统启动时间?
uptime cat /proc/uptime如何查看网络连接状态?
netstat -an ss -tan如何测试串口通信?
stty -F /dev/ttyS0 cat /dev/ttyS0 echo "test" > /dev/ttyS0如何查看GPIO状态?
cat /sys/class/gpio/gpioX/value cat /sys/kernel/debug/gpio如何查看I2C设备?
i2cdetect -l i2cdetect -y 1
十、实用技巧与组合命令
10.1 常用组合命令
# 查找并删除7天前的日志文件
find /var/log -name "*.log" -mtime +7 -exec rm {} \;
# 统计目录下文件个数
find /path -type f | wc -l
# 查看占用内存最多的进程
ps aux | sort -nk +4 | tail
# 查看占用CPU最多的进程
ps aux | sort -nk +3 | tail
# 批量重命名文件
for file in *.txt; do mv "$file" "prefix_$file"; done
# 查看目录大小并排序
du -sh * | sort -rh
# 实时查看网络连接数
watch -n 1 "netstat -an | grep ESTABLISHED | wc -l"
# 监控目录变化
watch -n 1 'ls -l'10.2 Shell快捷键
# 编辑快捷键
Ctrl + A # 移动到行首
Ctrl + E # 移动到行尾
Ctrl + U # 删除到行首
Ctrl + K # 删除到行尾
Ctrl + W # 删除前一个单词
Ctrl + Y # 粘贴上次删除的内容
# 历史命令
Ctrl + R # 搜索历史命令
Ctrl + P # 上一条命令
Ctrl + N # 下一条命令
!! # 执行上一条命令
!$ # 上一条命令的最后一个参数
# 进程控制
Ctrl + C # 终止当前命令
Ctrl + Z # 暂停当前命令
Ctrl + D # 退出当前Shell10.3 环境变量相关
# 查看环境变量
env
printenv
echo $PATH
# 设置环境变量
export VAR=value
export PATH=$PATH:/new/path
# 永久生效(添加到~/.bashrc或~/.profile)
echo 'export VAR=value' >> ~/.bashrc
source ~/.bashrc总结
掌握这些Shell指令对于嵌入式开发工程师至关重要,不仅能提高日常工作效率,还能在面试中展现出扎实的技术基础。建议:
- 分类记忆:将命令按功能分类记忆
- 实践为主:多在实际工作中使用
- 理解原理:不仅知道怎么用,还要知道为什么
- 组合使用:学会将简单命令组合解决复杂问题
- 阅读手册:遇到不熟悉的命令多看man page
嵌入式开发中特别需要关注:
- 系统资源监控(内存、CPU、IO)
- 内核和驱动调试
- 交叉编译环境
- 硬件接口操作(GPIO、I2C、SPI等)
- 启动流程和系统初始化
持续学习和实践是掌握Shell命令的最佳途径!
