当前位置: 首页 > news >正文

Shell / Bash 学习

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

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

  • Devhints – Bash Scripting Cheatsheet (Devhints.io cheatsheets)
  • LinuxConfig Bash Scripting Cheat Sheet (Linux Config)
  • Red Hat Bash Cheat Sheet (Red Hat Developer)

常用语法 & 概念速览

主题 语法 / 示例 说明
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 ]]; thenecho "Usage: $0 <file_or_dir>"exit 1
    fitarget="$1"
    recycle="recycle_bin"
    mkdir -p "$recycle"if [[ ! -e "$target" ]]; thenecho "$target: no such file or directory"exit 1
    finame=$(basename "$target")
    dest="$recycle/$name"
    if [[ -e "$dest" ]]; thendest="${recycle}/${name}_$(date +%s)"
    fimv "$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)

http://www.hskmm.com/?act=detail&tid=23176

相关文章:

  • 【Linux 架构探幽:从入门到内核・系统编程开篇】基础指令与权限精讲,筑牢框架制作根基
  • 使用 Dart 进行验证码识别
  • 用 Rust 进行验证码识别
  • teset3
  • Java并发编程(5)
  • 定时任务详解
  • 华为wlan无线配置 - 教程
  • PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
  • 可持久化数据结构
  • 2025.10.2——1黄
  • 图的匹配
  • Tarjan 算法
  • Mondriaans Dream题解
  • 网络流 最大流 Dinic 算法
  • 2025.10.2 测试
  • 数学章节总结
  • 软件工程_作业一
  • CF VP 记录
  • LabVIEW与PLC 汽车驻车制动自动调整 - 实践
  • 04. 布局管理
  • 关于安装博客园皮肤中有关于配置音乐播放器的补充(awescnb)
  • AGC VP 记录 2
  • 2025 --【J+S 二十连测】-- 第四套 总结
  • Websocket+cpolar:如何轻松实现服务远程访问? - 教程
  • 如何用C语言实现5种基本的排序算法
  • 函数-装饰器基础知识+推导式
  • VUE - 实战 2
  • QBXT2025S刷题 Day1
  • 2025多校冲刺CSP模拟赛1(螳臂复活祭)
  • mobvista三月之旅(In Peking)