LInux—shell编程

一、Shell 编程核心特性

  1. 解释型语言

    • 无需编译,直接由 bash、sh 等解释器逐行执行。

    • 类似 PHP 的解释执行,不同于 C 的编译型。

  2. 系统命令集成

    • 可直接调用 Linux 命令(如 ls、grep、awk),实现系统管理自动化。

    • 与 C/PHP 的库函数调用逻辑不同。

  3. 面向文本处理

    • 擅长处理文件、管道(|)、输入输出重定向(>、>>、<)。
  4. 轻量级脚本

    • 适合快速编写小型工具,语法简洁,但复杂逻辑不如 C/PHP 灵活。

二、Shell 基础语法详解

1. 变量
  • 定义与赋值(无需声明类型,等号两侧无空格):

    bash 复制代码
    name="Alice"       # 字符串
    count=10           # 数值
    files=$(ls)        # 命令替换(结果存入变量)
  • 使用变量 ($ 符号引用):

    bash 复制代码
    echo $name         # 输出变量值
    echo "$name"       # 推荐用双引号避免空格问题
    echo "${name}_01"  # 明确变量边界
  • 作用域 :默认全局,函数内用 local 声明局部变量。

  • 对比:

    bash 复制代码
    PHP:$name = "Alice";,类型自动推导。
    
    C:需声明类型(char name[] = "Alice";)。
2. 输入与输出
  • 输出:

    bash 复制代码
    echo "Hello, $name!"          # 自动换行
    printf "Count: %d\n" $count   # 格式化输出(类似 C 的 printf)
  • 输入:

    bash 复制代码
    read -p "Enter your name: " name   # 读取用户输入到变量
  • 对比:

    bash 复制代码
    C:scanf("%s", name);
    
    PHP:$name = fgets(STDIN);
3. 条件判断
  • 语法:

    bash 复制代码
    if [ $a -eq $b ]; then
        echo "a equals b"
    elif [ $a -gt $b ]; then
        echo "a > b"
    else
        echo "a < b"
    fi
  • 判断条件:

    bash 复制代码
    数值比较:-eq(等于)、-ne(不等于)、-gt(大于)。
    
    字符串比较:=(相等)、!=(不等)。
    
    文件检查:-f(文件存在)、-d(目录存在)。
  • 对比:

    bash 复制代码
    C/PHP:使用 ==、> 等运算符,条件写在 () 内。
    
    Shell 的 [ ] 等同于 test 命令,需严格空格。
4. 循环
  • for 循环:

    bash 复制代码
    for i in {1..5}; do
        echo "Number: $i"
    done
    
    for file in *.txt; do
        echo "Processing $file"
    done
  • while 循环:

    bash 复制代码
    count=1
    while [ $count -le 5 ]; do
        echo "Count: $count"
        ((count++))       # 算术运算需用双括号
    done
  • 对比:

    bash 复制代码
    PHP:for ($i=1; $i<=5; $i++) { ... }
    
    C:for (int i=1; i<=5; i++) { ... }
5. 函数
  • 定义与调用:

    bash 复制代码
    function greet() {
        local name=$1      # 局部变量
        echo "Hello, $name!"
    }
    
    greet "Bob"            # 调用函数并传参
  • 参数传递:

    bash 复制代码
    通过位置参数 $1、$2 访问,$# 表示参数个数。
    
    返回值:通过 return 返回整数状态码(0 表示成功),或 echo 返回字符串。
  • 对比:

    bash 复制代码
    C/PHP:函数需明确参数列表和类型,返回类型固定。

三、Shell 特有功能

1. 特殊变量
bash 复制代码
$0:脚本名称。

$1、$2...:脚本参数。

$?:上一条命令的退出状态。

$$:当前进程 PID。
2. 通配符与扩展
bash 复制代码
*:匹配任意字符。

?:匹配单个字符。

{a,b,c}:生成组合(如 file{1..3}.txt)。
3. 管道与重定向
bash 复制代码
ls -l | grep ".txt"       # 管道传递输出
echo "Hello" > output.txt # 覆盖写入文件
echo "World" >> output.txt # 追加写入

四、与 C/PHP 的关键差异

特性 Shell C PHP
执行方式 解释执行 编译为二进制 解释执行(Web 环境)
变量类型 无需声明,均为字符串 需显式声明类型(int, char 等) 动态类型(自动推导)
语法结构 依赖空格和缩进 严格使用分号和大括号 类似 C,分号和大括号
函数返回值 返回状态码(0-255) 返回任意类型值 返回任意类型值
调试难度 简单(直接运行) 需编译后调试(gdb) 直接运行,集成错误日志
适用场景 系统管理、自动化脚本 系统级开发、高性能应用 Web 开发、后端逻辑

五、快速入门学习建议

  1. 基础练习:

    • 编写脚本输出系统信息(如时间、用户)。

    • 使用循环批量重命名文件。

  2. 调试技巧:

    • 添加 set -x 在运行时显示详细执行过程。

    • 使用 echo 打印变量值。

  3. 避坑指南:

    • 空格敏感 :[ $a == $b ] 中的空格必须保留。

    • 引号使用 :变量含空格时需用双引号包裹(如 "$files")。

    • 权限问题 :脚本需添加执行权限(chmod +x script.sh)。

相关推荐
励志师code7 分钟前
RoCE 网络实战:从 NCCL 调优到 RDMA 硬件计数器排障
linux·运维·网络·云计算
水饺编程11 分钟前
第2章:Linux 基础,pwd 命令
linux·c语言·汇编
白帽攻防录11 分钟前
SRC 挖洞:Android 蓝牙预认证 RCE 深度复盘,CVE-2026-55330 怎么在蓝牙范围内零交互攻破手机
android·网络安全·智能手机·src漏洞挖掘
鱼很腾apoc12 分钟前
【MySQL】 第1期 从核心概念到表约束全解析
linux·c语言·数据库·学习·mysql
程序员-Benothing19 分钟前
Linux进程优先级与调度:nice、renice、CPU亲和性实战
linux·运维·服务器
程序员-Benothing22 分钟前
Linux进程前后台管理:jobs、fg、bg、nohup、disown
linux·运维·服务器
vilya23 分钟前
手机端 Agent 是怎么跑起来的:决策循环、四道护栏、两条红线
android·agent
2501_9159214324 分钟前
详细教程:使用Perfdog工具测量iOS应用的功耗性能与优化方法
android·macos·ios·小程序·uni-app·cocoa·iphone
hunterandroid1 小时前
android方案 : Multiplatform 跨平台开发实战:一套代码,多端运行
android·前端