掌握Linux命令是程序员的基本功,而Shell脚本则是自动化运维的神器
本文带你从零开始,成为Linux开发高手
一、Linux操作系统:程序员的第二操作系统
1.1 为什么每个程序员都要学Linux?
如果你只会在Windows上写代码,那么你可能会错过:
-
服务器部署:超过90%的服务器运行在Linux上
-
高效开发:强大的命令行工具链
-
容器化技术:Docker、Kubernetes的基石
-
开源生态:最活跃的开发社区
1.2 Linux操作系统的三层架构
┌─────────────────────┐
│ 应用程序 │ ← 你编写的程序
├─────────────────────┤
│ Shell/终端 │ ← 人机交互接口
├─────────────────────┤
│ 库函数 │ ← 标准C库、系统调用封装
├─────────────────────┤
│ Linux内核 │ ← 硬件资源管理
├─────────────────────┤
│ 硬件 │ ← CPU、内存、磁盘
└─────────────────────┘
Linux内核的核心功能:
进程管理:创建、调度、销毁进程
内存管理:虚拟内存、物理内存分配
文件系统:ext4、xfs、NTFS支持
设备驱动:硬件设备控制
网络协议:TCP/IP协议栈实现
二、Shell命令:程序员的瑞士军刀
2.1 文件操作:一切皆文件
查看目录内容
# 基本查看
ls # 列出当前目录内容
ls -l # 详细列表(权限、大小、时间)
ls -a # 显示隐藏文件(以.开头)
ls -lh # 人性化显示文件大小
# 示例输出解析
# drwxr-xr-x 2 user group 4096 Jan 10 10:00 dirname
# ↑权限 ↑链接数 ↑所有者 ↑组 ↑大小 ↑修改时间 ↑文件名
目录导航
cd /home/user # 切换到绝对路径
cd .. # 返回上级目录
cd ~ # 返回家目录
cd – # 返回上一个目录
pwd # 显示当前目录完整路径
2.2 文件内容查看:多种姿势任你选
基本查看命令
# 查看整个文件
cat filename # 一次性显示全部内容
cat -n filename # 显示行号
# 查看文件部分
head -n 10 filename # 查看前10行
tail -n 20 filename # 查看后20行
tail -f filename # 实时追踪文件变化(日志监控)
# 分页查看
less filename # 上下翻页,支持搜索
more filename # 只能向下翻页
内容搜索
# 在文件中搜索
grep "error" log.txt # 查找包含"error"的行
grep -i "ERROR" log.txt # 忽略大小写
grep -n "pattern" file.txt # 显示行号
grep -r "function" ./src # 递归搜索目录
grep -v "debug" log.txt # 反向搜索(不包含)
# 管道组合使用
ps aux | grep "python" # 查找Python进程
cat access.log | grep "404" | wc -l # 统计404错误数量
2.3 文件权限管理:Linux的安全基石
理解权限表示
rwx rwx rwx
↑ ↑ ↑
用户 组 其他
r = 4 (读)
w = 2 (写)
x = 1 (执行)
– = 0 (无权限)
示例:rwxr-xr– = 754
用户:4+2+1=7
组:4+0+1=5
其他:4+0+0=4
修改权限
# 数字方式
chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r–r–
# 符号方式
chmod u+x script.sh # 给用户增加执行权限
chmod g-w file.txt # 移除组的写权限
chmod o=r file.txt # 设置其他用户只读
chmod a+x script.sh # 给所有人增加执行权限
# 修改所有者
chown user:group file.txt # 修改所有者和组
chown user file.txt # 只修改所有者
chgrp developers file.txt # 只修改所属组
2.4 文件查找与压缩
文件查找
# 按名称查找
find /home -name "*.txt" # 查找.txt文件
find . -iname "readme*" # 忽略大小写
find /var/log -name "*.log" -mtime -7 # 7天内修改的日志
# 按类型查找
find . -type f # 只找普通文件
find . -type d # 只找目录
find . -type l # 只找符号链接
# 按大小查找
find . -size +10M # 大于10MB的文件
find . -size -1k # 小于1KB的文件
# 查找后执行操作
find . -name "*.tmp" -delete # 删除临时文件
find . -name "*.sh" -exec chmod +x {} \\; # 给脚本加执行权限
压缩与解压
# .tar.gz 格式(最常用)
tar -zcvf archive.tar.gz dirname/ # 压缩
tar -zxvf archive.tar.gz # 解压
tar -ztvf archive.tar.gz # 查看内容
# .tar.bz2 格式(更高压缩比)
tar -jcvf archive.tar.bz2 dirname/ # 压缩
tar -jxvf archive.tar.bz2 # 解压
# .zip 格式(跨平台)
zip -r archive.zip dirname/ # 压缩
unzip archive.zip # 解压
# 分卷压缩(大文件传输)
tar -zcvf – large_dir/ | split -b 100m – archive.tar.gz.
cat archive.tar.gz.* | tar -zxvf – # 合并解压
三、系统管理:成为Linux系统管理员
3.1 进程管理
查看进程
# 查看所有进程
ps aux # 详细进程信息
ps -ef # 标准格式
top # 动态查看(按q退出)
htop # 增强版top(需安装)
# 查看特定进程
pgrep nginx # 查找nginx进程ID
ps aux | grep "python" # 查找Python进程
pstree # 树状显示进程关系
进程控制
# 结束进程
kill 1234 # 正常终止进程1234
kill -9 1234 # 强制杀死进程
killall nginx # 结束所有nginx进程
pkill -f "pattern" # 根据模式结束进程
# 进程优先级
nice -n 10 command # 低优先级运行
renice 5 -p 1234 # 修改运行中进程优先级
3.2 网络管理
网络配置
# 查看网络信息
ifconfig # 查看所有网卡信息
ip addr show # 新式查看IP命令
netstat -tulnp # 查看网络连接和端口
ss -tulnp # 更快的netstat替代
# 网络测试
ping google.com # 测试连通性
traceroute google.com # 追踪路由路径
mtr google.com # 持续追踪
nslookup google.com # DNS查询
dig google.com # 详细DNS查询
Ubuntu网络配置
# 编辑网络配置
sudo vim /etc/network/interfaces
# 添加DHCP配置
auto ens33
iface ens33 inet dhcp
# 重启网络
sudo systemctl restart networking
# 或
sudo /etc/init.d/networking restart
3.3 软件包管理
APT(Debian/Ubuntu)
# 更新源
sudo apt-get update # 更新软件包列表
sudo apt-get upgrade # 升级已安装的包
sudo apt-get dist-upgrade # 升级系统
# 安装软件
sudo apt-get install vim # 安装vim
sudo apt-get install nginx mysql-server # 安装多个
# 搜索软件
apt-cache search "web server" # 搜索软件包
apt-cache show nginx # 查看软件包信息
# 卸载软件
sudo apt-get remove vim # 卸载但保留配置
sudo apt-get purge vim # 完全卸载
sudo apt-get autoremove # 清理无用依赖
DPKG(底层包管理)
# 安装本地deb包
sudo dpkg -i package.deb
# 查看已安装
dpkg -l | grep nginx # 查找已安装的nginx
dpkg -L nginx # 列出nginx安装的文件
# 修复依赖
sudo apt-get install -f # 修复损坏的依赖
四、Shell脚本编程:自动化运维的核心
4.1 Shell脚本基础
创建第一个脚本
#!/bin/bash
# 第一行指定解释器
# 这是注释
echo "Hello, World!" # 输出文本
echo "当前用户: $(whoami)" # 命令替换
echo "当前目录: $PWD" # 环境变量
脚本执行方式
# 方法1:添加执行权限
chmod +x script.sh
./script.sh
# 方法2:指定解释器
bash script.sh
sh script.sh
# 方法3:source执行(在当前shell执行)
source script.sh
. script.sh # 简写形式
4.2 变量与参数
变量使用
#!/bin/bash
# 变量定义与使用
name="Linux Master" # 定义变量
echo "Hello, $name!" # 使用变量
echo "Hello, ${name}!" # 明确变量边界
# 只读变量
readonly PI=3.14
# PI=3.1415 # 错误:只读变量不能修改
# 删除变量
unset name # 删除变量
特殊变量
#!/bin/bash
echo "脚本名: $0" # 脚本名称
echo "第一个参数: $1" # 位置参数$1-$9
echo "第二个参数: $2"
echo "参数个数: $#" # 参数总数
echo "所有参数: $@" # 所有参数列表
echo "所有参数: $*" # 所有参数字符串
echo "上一个命令返回值: $?" # 0表示成功
echo "当前进程ID: $$" # 进程ID
echo "后台最后一个进程ID: $!" # 后台进程ID
4.3 条件判断
if语句
#!/bin/bash
# 基本格式
if [ condition ]; then
commands
elif [ condition ]; then
commands
else
commands
fi
# 数值比较
if [ $a -eq $b ]; then # 等于
if [ $a -ne $b ]; then # 不等于
if [ $a -gt $b ]; then # 大于
if [ $a -lt $b ]; then # 小于
if [ $a -ge $b ]; then # 大于等于
if [ $a -le $b ]; then # 小于等于
# 字符串比较
if [ "$str1" = "$str2" ]; then # 等于
if [ "$str1" != "$str2" ]; then # 不等于
if [ -z "$str" ]; then # 空字符串
if [ -n "$str" ]; then # 非空字符串
# 文件测试
if [ -f "$file" ]; then # 是普通文件
if [ -d "$dir" ]; then # 是目录
if [ -e "$path" ]; then # 存在
if [ -r "$file" ]; then # 可读
if [ -w "$file" ]; then # 可写
if [ -x "$file" ]; then # 可执行
test命令
# test等价于[]
if test -f file.txt; then
echo "文件存在"
fi
# 复合条件
if [ -f file.txt ] && [ -r file.txt ]; then
echo "文件存在且可读"
fi
if [ $age -gt 18 ] || [ $permission = "admin" ]; then
echo "允许访问"
fi
4.4 循环控制
for循环
#!/bin/bash
# 列表循环
for fruit in apple banana orange; do
echo "水果: $fruit"
done
# 数字范围
for i in {1..5}; do
echo "数字: $i"
done
for i in $(seq 1 2 10); do # 1到10,步长2
echo "奇数: $i"
done
# 文件遍历
for file in *.txt; do
echo "文本文件: $file"
done
# C风格
for ((i=0; i<5; i++)); do
echo "计数: $i"
done
while循环
#!/bin/bash
# 条件循环
count=1
while [ $count -le 5 ]; do
echo "计数: $count"
count=$((count + 1))
done
# 读取文件
while read line; do
echo "行内容: $line"
done < file.txt
# 无限循环
while true; do
echo "按Ctrl+C退出"
sleep 1
done
until循环
#!/bin/bash
# 直到条件为真
count=1
until [ $count -gt 5 ]; do
echo "计数: $count"
count=$((count + 1))
done
4.5 函数定义
#!/bin/bash
# 函数定义
function say_hello() {
echo "Hello, $1!"
return 0
}
# 调用函数
say_hello "World"
# 获取返回值
say_hello "Linux"
result=$?
echo "函数返回值: $result"
# 函数参数
function add() {
local result=$(( $1 + $2 )) # local定义局部变量
echo $result
}
sum=$(add 10 20)
echo "10 + 20 = $sum"
五、实战案例:Shell脚本解决实际问题
5.1 系统监控脚本
#!/bin/bash
# system_monitor.sh
# 系统资源监控脚本
LOG_FILE="/var/log/system_monitor.log"
# 记录时间戳
echo "=== $(date) ===" >> $LOG_FILE
# CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
echo "CPU使用率: ${CPU_USAGE}%" >> $LOG_FILE
# 内存使用
MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
MEM_USAGE=$((MEM_USED * 100 / MEM_TOTAL))
echo "内存使用率: ${MEM_USAGE}%" >> $LOG_FILE
# 磁盘使用
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
echo "根分区使用率: ${DISK_USAGE}%" >> $LOG_FILE
# 进程数
PROCESS_COUNT=$(ps aux | wc -l)
echo "运行进程数: $PROCESS_COUNT" >> $LOG_FILE
# 发送警报
if [ $CPU_USAGE -gt 80 ] || [ $MEM_USAGE -gt 80 ] || [ $DISK_USAGE -gt 80 ]; then
echo "警告:系统资源使用过高!" >> $LOG_FILE
# 可以添加邮件通知
# echo "系统警报" | mail -s "资源警报" admin@example.com
fi
5.2 备份脚本
#!/bin/bash
# backup_script.sh
# 自动备份脚本
BACKUP_DIR="/backup"
SOURCE_DIR="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_${DATE}.tar.gz"
LOG_FILE="/var/log/backup.log"
# 创建备份目录
mkdir -p $BACKUP_DIR
echo "[$(date)] 开始备份…" >> $LOG_FILE
# 执行备份
if tar -zcpf "$BACKUP_DIR/$BACKUP_FILE" -C "$SOURCE_DIR" . 2>>$LOG_FILE; then
echo "[$(date)] 备份成功: $BACKUP_FILE" >> $LOG_FILE
# 删除7天前的备份
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete >> $LOG_FILE 2>&1
echo "[$(date)] 已清理7天前备份" >> $LOG_FILE
else
echo "[$(date)] 备份失败!" >> $LOG_FILE
exit 1
fi
5.3 服务监控脚本
#!/bin/bash
# service_monitor.sh
# 监控关键服务
SERVICES=("nginx" "mysql" "redis")
check_service() {
local service_name=$1
if systemctl is-active –quiet $service_name; then
echo "✓ $service_name 运行正常"
return 0
else
echo "✗ $service_name 已停止,尝试重启…"
systemctl restart $service_name
sleep 2
if systemctl is-active –quiet $service_name; then
echo "✓ $service_name 重启成功"
return 1
else
echo "✗ $service_name 重启失败,请手动检查!"
return 2
fi
fi
}
# 检查所有服务
for service in "${SERVICES[@]}"; do
check_service $service
done
六、Shell脚本调试与优化
6.1 调试技巧
#!/bin/bash
# 启用调试
set -x # 显示执行的命令
echo "调试开始"
set +x # 关闭调试
# 详细模式
set -v # 显示读取的输入
set +v
# 严格模式
set -e # 遇到错误立即退出
set -u # 使用未定义变量报错
set -o pipefail # 管道中任一命令失败则失败
# 调试信息
echo "当前行号: $LINENO"
echo "脚本名: $0"
6.2 性能优化
#!/bin/bash
# 避免频繁调用外部命令
# 不好
for file in $(ls *.txt); do
wc -l "$file"
done
# 好
wc -l *.txt
# 使用内置字符串操作
# 不好
basename=$(echo $file | awk -F'.' '{print $1}')
# 好
basename=${file%.*}
# 减少子shell创建
# 不好
result=$(echo "scale=2; 10/3" | bc)
# 好(如果可能)
result=$((10/3))
七、学习路径与资源推荐
7.1 30天Linux学习计划
-
第1周:基础命令(ls、cd、mkdir、rm、cp、mv)
-
第2周:文件操作(vim、cat、grep、find、tar)
-
第3周:系统管理(ps、top、netstat、systemctl)
-
第4周:Shell脚本(变量、条件、循环、函数)
7.2 推荐学习资源
书籍:
-
《UNIX环境高级编程》
-
《Linux命令行与shell脚本编程大全》
在线资源:
-
Linux man pages:man command
-
TLDR pages:简化的man页面
-
Linux Journey:互动式学习网站
练习平台:
-
OverTheWire:WarGames游戏
-
Bandit:CTF风格的Linux学习
-
LeetCode Shell题库
7.3 实战项目建议
搭建个人博客服务器
编写系统监控面板
实现自动化部署脚本
创建日志分析工具
八、常见问题与解决方案
8.1 权限问题
# Permission denied
sudo command # 使用sudo提权
chmod +x script.sh # 添加执行权限
chown user:group file # 修改文件所有者
# 忘记sudo密码
# 进入恢复模式修改
8.2 中文乱码
# 查看当前编码
echo $LANG
# 设置UTF-8
export LANG=en_US.UTF-8
# 或
export LANG=zh_CN.UTF-8
8.3 脚本不执行
# 检查是否在首行指定解释器
#!/bin/bash
# 检查文件格式
dos2unix script.sh # 转换Windows换行符
# 检查执行权限
ls -l script.sh
chmod +x script.sh
结语
Linux和Shell脚本是程序员必备的技能,从基本的文件操作到复杂的自动化脚本,掌握这些技能能极大提高工作效率。
记住:
多动手,少死记
善用man和–help
从简单脚本开始,逐步复杂
实际项目中应用是最好的学习
立即行动:
打开你的Linux终端
创建第一个Shell脚本
尝试自动化一个重复任务
在评论区分享你的脚本
真正的掌握,来自于解决实际问题的实践。
互动环节:
你正在学习Linux的哪个方面?
在Shell脚本编写中遇到的最大困难是什么?
分享你的经验或问题,我们一起讨论解决!




