当前位置: 首页 > 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.jsqmd.com/news/7385/

相关文章:

  • 【Linux 架构探幽:从入门到内核・系统编程开篇】基础指令与权限精讲,筑牢框架制作根基
  • chisel,spatial和spinalhdl的比较
  • 国庆集训Day1
  • ChIPBase network菜单 生成tf的excel ,用于构建 TF → mRNA(即 CDKN3)调控关系的详细过程和教程 - 实践
  • 实用指南:机器学习:线性回归
  • 定时任务详解
  • Linux系统中配置SSH安全和Docker安装
  • Markdown语法入门三:链接,图片,分隔线与引用
  • 华为wlan无线配置 - 教程
  • 开源 C# 飞快研发(十三)进程--管道通讯
  • Spring Boot 内置日志框架 Logback - 以及 lombok 介绍 - 教程
  • PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
  • 图的匹配
  • Tarjan 算法
  • 临项交换
  • CF VP 记录
  • 华为设备MSTP - 指南
  • LabVIEW与PLC 汽车驻车制动自动调整 - 实践
  • 04. 布局管理
  • 关于安装博客园皮肤中有关于配置音乐播放器的补充(awescnb)
  • AGC VP 记录 2
  • 2025 --【J+S 二十连测】-- 第四套 总结
  • 深入解析:AI-调查研究-90-具身智能 机器人数据采集与通信中间件全面解析:ROS/ROS2、LCM 与工业总线对比
  • 函数-装饰器基础知识+推导式
  • 机器人产业学院 —— 教培机构 —— 职业发展 —— 全国性比赛
  • VUE - 实战 2
  • QBXT2025S刷题 Day1
  • 2025多校冲刺CSP模拟赛1(螳臂复活祭)
  • 短剧小程序核心专业的技术拆解:视频加载优化、用户留存与商业化落地​
  • 完整教程:Apache Doris 入门与技术替代方案