欢迎光临
我们一直在努力

0基础学嵌入式--全网最详细Linux开发指南:一篇文章带你从小白到Shell脚本高手

        掌握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脚本编写中遇到的最大困难是什么?

    分享你的经验或问题,我们一起讨论解决!

    赞(0)
    未经允许不得转载:171主机测评 » 0基础学嵌入式--全网最详细Linux开发指南:一篇文章带你从小白到Shell脚本高手
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址