Shell / Bash 学习

一、Shell / Bash 快速 Cheat Sheet(速查手册)

以下摘自 Devhints、LinuxConfig 和 Red Hat 的优秀 Bash cheat sheet 集合:

常用语法 & 概念速览

主题 语法 / 示例 说明
Shebang #!/bin/bash#!/usr/bin/env bash 指定脚本解释器
注释 # 这是注释 行内注释,不执行
执行权限 chmod +x script.sh 使脚本可执行
变量 name="Alice"${name}$name 赋值与引用(等号两侧不能有空格)
参数 $0(脚本名)、$1$2$#(参数个数) 访问传入脚本的命令行参数
条件判断 bash if [[ condition ]]; then … elif … else … fi 也可用 test …[ ]
字符串比较 ==, !=, <, >(在 [[ ]] 中) 注意空格与引号
整数比较 -eq, -ne, -lt, -gt, -le, -ge 例如 if [[ $a -gt $b ]]; then … fi
循环 for var in list; do … donewhile condition; do … done 常用于遍历、重复执行
函数 bash my_func() { commands; } 内部可用 returnecho 输出
命令替换 `command`$(command) 把命令输出作为值
重定向 / 管道 >>><2>,管道符 ` ` 控制输入、输出、错误流
数组 arr=(a b c)${arr[0]}${#arr[@]} Bash 支持一维数组
错误处理 set -eset -utrap '…' EXIT ERR 写更健壮的脚本
执行状态 $? 上一个命令的退出码(0 成功,非 0 失败)
流程控制 break, continue 用在循环中跳出或继续下一个迭代
流程替换 <(...)>(...) 高级用法,生成匿名文件描述符

Tips

  • 写脚本时常用 bash -n script.sh 检查语法错误。
  • shellcheck script.sh 静态分析潜在错误或风格缺陷。
  • 多阅读开源脚本,看别人的写法与风格。

二、两个练习题 + 解题思路

下面是两个适合练手的小练习题。做完后你可以与同类 Bash / Shell 脚本对比、改进。

练习题 1:统计当前目录下 .txt 文件个数

题目
写一个脚本 count_txt.sh,统计当前目录里后缀为 .txt 的文件数量,并打印结果。

要求

  • 使用 find 或通配符方式实现。
  • 输出形式:There are N .txt files in the current directory.
  • 如果没有 .txt 文件,输出 0

解题思路 / 提示

  • find . -maxdepth 1 -type f -name "*.txt" 找同目录下 txt 文件。

  • | wc -l 得到数量。

  • 或使用 for file in *.txt; do …; done,注意当没有 .txt*.txt 会被字面展开为 *.txt,要加判断。

  • 示例解法(极简):

    #!/bin/bash
    count=$(find . -maxdepth 1 -type f -name "*.txt" | wc -l)
    echo "There are $count .txt files in the current directory."
    

练习题 2:安全删除脚本 safe_rm.sh

题目
写一个脚本 safe_rm.sh,实现一个“安全删除”的功能:

  • 接受 一个 参数 file_path
  • 检查参数个数:如果不是正好一个参数,提示用法并退出(退出码非 0)。
  • 如果文件或目录存在,将其移动(或复制)到一个名为 recycle_bin 的目录(在当前目录下,如果不存在就创建)。
  • 然后删除原位置(即从当前目录中移除它)。
  • 输出移动操作与删除操作的信息。

要求

  • 脚本要对文件 / 目录皆适用。
  • 保证不覆盖 recycle_bin 中已有同名文件(可重命名或添加时间戳后缀)。
  • 删除操作要小心,避免误删。

解题思路 / 提示

  • 利用 $# 检查参数个数。

  • mkdir -p recycle_bin 创建 recycle 目录(若不存在)。

  • basename 得到文件名。

  • 检查目标是否已存在,若存在可用 date +%smv file recycle_bin/"$name_$(date)".

  • 使用 mvcp + rm

  • 示例骨架:

    #!/bin/bash
    if [[ $# -ne 1 ]]; then
      echo "Usage: $0 <file_or_dir>"
      exit 1
    fi
    
    target="$1"
    recycle="recycle_bin"
    mkdir -p "$recycle"
    
    if [[ ! -e "$target" ]]; then
      echo "$target: no such file or directory"
      exit 1
    fi
    
    name=$(basename "$target")
    dest="$recycle/$name"
    if [[ -e "$dest" ]]; then
      dest="${recycle}/${name}_$(date +%s)"
    fi
    
    mv "$target" "$dest"
    echo "Moved $target -> $dest"
    exit 0
    

你可以在这个骨架上加复杂功能(如保留目录结构、软链接处理等)。


三、额外练习 / 练习资源链接

  • w3resource Bash 脚本练习(含题目 & 参考答案)(w3resource)
  • Exercism Bash Track:提供很多练习、自动评测与社区反馈 (Exercism)
  • 高级 Bash 练习题(适合进阶)(Innolitics)
  • Rutgers 大学 Shell 脚本练习:从基础到中级题目都有 (Linux Course)
  • Duke 大学 UNIX Shell 练习与答案 (people.duke.edu)

posted @ 2025-10-02 22:07  光辉233  阅读(10)  评论(0)    收藏  举报