Bash学习记录

Table of Contents

Bash 初探

为什么要学 Bash?

![[5ddd6212ebd0b7f987120a6e0fd2c34c_MD5.jpg]]

在当今的数字化世界中,掌握一些基本的编程和脚本技能能让我们的工作事半功倍。而 Bash,作为 Linux 和 Mac 系统中的默认 shell,就是这样一个能帮你打开高效操作大门的神器。

无论是系统管理员进行日常维护、软件开发人员部署项目,还是普通用户想要定制自己的工作流程,Bash 都能派上用场。通过简单的命令组合,你可以自动化那些重复繁琐的任务,比如批量文件处理、系统监控、软件安装等,节省大量时间和精力。想象一下,一键就能备份重要文件、更新软件库,甚至分析服务器日志,这些都可以通过 Bash 轻松实现。 学习 Bash,不仅能提升你的技术能力,更能让你深入理解操作系统的工作原理,真正掌控你的电脑。

揭开 Bash 的神秘面纱

![[8a761f731e88204758a7fdf6a79a1ab1_MD5.png]]

Bash,全称为 Bourne-Again Shell,是一种 Unix shell,同时也是一个命令语言。它诞生于 1987 年,由布莱恩・福克斯为了 GNU 计划而编写,旨在创建一个自由软件的 Shell,以替代当时的 Bourne Shell。经过两年的精心打磨,1989 年,Bash 1.0 正式发布,这一版本具有与 Bourne Shell 兼容的功能,并引入了一些来自 C Shell(csh)和 Korn Shell(ksh)的特性,如命令历史、命令行编辑和目录堆栈等,为后续的发展奠定了坚实基础。

Bash 这个名称本身就暗藏玄机,它其实是 Bourne shell(sh)的一个双关语 ——Bourne-Again Shell,寓意着重生与延续,意味着它既继承了 Bourne shell 的经典特性,又在此基础上不断进化。作为 Bourne shell 的后继兼容版本与开放源代码版本,Bash 的基本特性,如关键字、语法等大多借鉴自 sh,而像历史命令等一些实用特性,则是从 csh 和 ksh 中汲取灵感,博采众长,终成大器。

虽然 Bash 严格遵循 POSIX 规范,但它并未固步自封,而是积极扩展,拥有诸多独特且强大的功能,这使得它从众多 Unix shell 中脱颖而出,成为 Linux 和 Mac 系统中的默认 shell,深受广大用户的喜爱与信赖。无论是简单的日常操作,还是复杂的系统管理、软件开发任务,Bash 都能以其高效、灵活的特性,帮助用户轻松应对,展现出无与伦比的魅力。

Bash 的超能力

命令历史记录

想象一下,你在终端中忙碌地敲打着命令,突然需要重复执行之前的某条指令,要是一条条重新输入,那得多麻烦!别担心,Bash 有个超贴心的 “记忆” 功能 —— 命令历史记录。它就像一个智能笔记本,默认会保存你输入的历史命令,你只需通过上下键轻轻翻动,就能快速找到并重新执行那些指令,是不是超方便?这些命令都被默默地记录在家目录下的.bash_history 文件里,这可是个隐藏的宝藏,当你需要回顾操作步骤、排查问题或是重复执行任务时,它就能派上大用场,助你一臂之力。

比如说,你之前安装软件时输入了一长串复杂的命令,过了几天需要更新软件,又忘了具体指令,这时候打开命令历史,一键就能找到,轻松搞定更新,大大节省时间,让操作更加流畅高效。

命令补全

在输入命令的时候,你是不是偶尔也会犯迷糊,不确定命令的完整拼写,或者面对一长串文件名无从下手?别着急,Bash 的命令补全功能来救场啦!当你输入命令或文件名的前几个字符后,轻轻按下 Tab 键,Bash 就会像个贴心的助手,自动帮你补全剩余部分。要是有多个匹配项,它还会列出所有可能,让你一目了然,精准选择。这不仅能减少输入错误,还能大幅提升效率,让你的操作如行云流水般顺畅。在 RHEL 7 等系统中,它更是厉害,连命令的参数都能补全,简直是把便捷度拉满。 以前,你可能要小心翼翼地输入一长串命令,生怕出错,现在有了补全功能,只需几个字符加 Tab 键,就能轻松搞定,是不是感觉工作效率瞬间飙升?

强大的脚本编程

如果你还在日复一日地手动重复那些繁琐的系统管理任务,那可就太 out 啦!Bash 脚本编程就是你的自动化利器。通过简单的脚本编写,你可以把日常的文件备份、系统软件更新、性能监控等任务统统交给 Bash 去自动执行,让你从重复劳动中解放出来,有更多时间去攻克难题、创新突破。比如说,下面这个简单的脚本就能帮你备份重要文件:

#!/bin/bash

backup_dir="/backup"

source_dir="/data"

date=$(date +%Y%m%d)

mkdir -p $backup_dir/$date

cp -r $source_dir/* $backup_dir/$date

短短几行代码,就能按日期自动备份指定文件夹的内容,是不是超酷?Bash 脚本语法简洁易懂,结合各种强大的命令,让你轻松驾驭系统任务,比那些图形化工具更加灵活高效,是系统管理员和开发者的必备技能。

实用的环境变量

环境变量听起来有点神秘,其实它就像是系统中的 “隐形助手”,默默掌控着许多关键设置。在 Bash 中,环境变量用途广泛,既能控制脚本的行为,又能帮你简化命令输入,让操作更加便捷。比如常见的 PATH 变量,它像是一张导航图,告诉系统去哪里找你输入的命令;HOME 变量则直接指向你的家目录,让你轻松访问个人文件。你还可以根据自己的需求,自定义环境变量,让系统更好地适配你的工作流程。在脚本中使用环境变量,能让程序更加智能、灵活,适应不同的运行环境。

# 自定义环境变量

MY_PROJECT_DIR="/home/user/projects"

export MY_PROJECT_DIR

# 在脚本中使用环境变量

cd $MY_PROJECT_DIR

ls

像这样,通过设置和使用环境变量,无论是切换工作目录还是执行特定任务,都能一键直达,高效又便捷,为你的日常操作加分不少。

实战演练:Bash 常用操作示例

基础命令操作

在 Bash 中,一些基础命令就像基石,能帮你快速完成日常操作。比如说,pwd 命令能瞬间显示当前所在的目录路径,让你随时清楚自己的 “位置”;ls 命令则像一个尽职的管家,列出当前目录下的所有文件和子目录,加上 -l 参数,还能详细展示文件的权限、所有者、大小等信息,助你快速了解文件状况;cd 命令更是导航利器,输入 cd 加目标目录,就能轻松切换工作路径,想去哪就去哪。这些看似简单的命令组合起来,威力可不容小觑。

举个例子,当你下载了一些文件,却忘记放在哪个文件夹时,只需在终端输入 pwd,就能获取当前路径,再用 ls -l 查看详细文件列表,迅速定位到目标文件。要是想进入某个子文件夹进一步查看,一条 cd 命令就能搞定,整个过程流畅高效,让你的文件管理得心应手。

文本处理

面对海量文本信息,Bash 提供的文本处理命令就派上大用场了。grep 如同精准的探测器,能在文本文件中快速找出包含特定关键词的行,搭配 -i 参数忽略大小写, -v 参数反向筛选,让搜索更加灵活;sed 则像一位神奇的魔法师,可以通过正则表达式对文本进行替换、删除等操作,一行简单的 sed -i’s/old/new/g’ 就能把文件中的所有 “old” 替换成 “new”;awk 更是强大的数据处理引擎,它能按照指定规则逐行处理文本,比如 awk ‘{print $1}’ 就能输出每行的第一个字段,无论是分析日志、提取数据,都游刃有余。

假设你有一个服务器日志文件,里面记录着各种访问信息,想要找出所有来自特定 IP 地址的访问记录,用 grep ‘192.168.1.100’ logfile 就能轻松实现;若要统计日志中某个关键词出现的次数,结合 grep 和 wc -l 命令,grep -c ‘keyword’ logfile 瞬间给出答案;要是想重新格式化日志,让每一行只保留关键信息,awk 就能大显身手,按照你的需求定制输出格式,快速完成复杂的数据处理任务。

脚本编写示例

掌握了基础命令和文本处理,就可以尝试编写简单的 Bash 脚本啦。比如,下面这个备份文件脚本:

#!/bin/bash

# 定义源目录和备份目录

source_dir="/home/user/documents"

backup_dir="/backup"

# 创建备份目录(如果不存在)

mkdir -p $backup_dir

# 获取当前日期作为备份文件夹名

date=$(date +%Y%m%d)

# 执行备份

cp -r $source_dir $backup_dir/$date

echo "文件备份完成,备份至 $backup_dir/$date"

把这段代码保存为 backup.sh,赋予执行权限 chmod +x backup.sh,运行它,就能自动按日期备份指定文件夹的内容到备份目录,再也不用担心重要文件丢失。

再看看这个监控系统资源脚本:

#!/bin/bash

# 检查CPU使用率

cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')

# 检查内存使用率

mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100}')

# 判断是否超出阈值

if [ $(echo "$cpu_usage > 80" | bc) -eq 1 ] || [ $(echo "$mem_usage > 80" | bc) -eq 1 ]; then

echo "系统资源使用率过高!CPU:$cpu_usage%,内存:$mem_usage%"

else

echo "系统资源正常,CPU:$cpu_usage%,内存:$mem_usage%"

fi

运行这个脚本,它会快速检查 CPU 和内存的使用率,一旦超出 80% 的阈值,就及时发出警报,让你随时掌握系统健康状况。

这些只是 Bash 脚本的冰山一角,你可以根据自己的需求,自由组合各种命令,创造出功能强大的自动化工具。

Bash 深潜

一、Bash 为什么出现/是为了解决什么问题

![[39a7a520c4f0a26a4c7538f23f3f07c3_MD5.png]]

在计算机发展的早期,Unix 系统中的命令行交互界面相对简陋,用户需要逐字输入命令,操作繁琐且效率低下。随着系统功能日益复杂,管理任务愈发繁重,迫切需要一种更高效、便捷的方式来与系统沟通。Bash 应运而生,它的出现旨在解决以下痛点:

  1. 命令重复输入:早期系统没有命令记忆功能,用户若要重复执行某条命令,只能重新完整输入,浪费大量时间。Bash 的命令历史记录功能彻底改变了这一局面,它自动保存用户输入过的命令,让你能轻松回溯、复用,极大提高操作效率。

  2. 命令输入易错:复杂命令或长文件名,手工输入极易出错。Bash 的命令补全功能,通过自动匹配和提示,让输入更精准,减少错误,使操作更加流畅。

  3. 任务自动化需求:系统管理、日常运维工作中,很多任务具有重复性,如文件备份、软件更新等。Bash 脚本编程能力,让用户能够编写脚本,将这些任务自动化执行,解放人力,降低出错概率,确保任务按时、准确完成。

  4. 环境定制需求:不同用户、不同项目对系统环境有个性化要求。Bash 的环境变量功能,允许用户灵活设置,无论是调整命令搜索路径,还是配置特定软件运行环境,都能轻松搞定,让系统更好地服务于多样化需求。

可以说,Bash 的诞生,是为了让计算机操作更加人性化、智能化,帮助用户从繁琐的手工操作中解脱出来,将精力聚焦于更具创造性的工作,它的每一项特性都精准击中用户痛点,成为系统管理与日常操作不可或缺的得力助手。

二、Bash 是怎样满足这个需求/解决这个问题的

Bash 通过一系列精巧设计的特性,巧妙地化解了早期 Unix 系统操作中的诸多难题:

面对命令重复输入的困扰,Bash 引入了命令历史记录功能。它如同一个智能的操作日志,默默存储用户输入过的命令。当需要再次执行某条指令时,用户只需借助上下方向键,就能轻松在历史命令列表中找到目标,一键重新执行,避免了繁琐的重复输入,极大提升了操作连贯性与效率。

针对命令输入易错的问题,Bash 的命令补全功能堪称神器。在用户输入命令或文件名的起始部分后,轻按 Tab 键,Bash 迅速依据已有的命令集、文件目录结构进行匹配。若输入具有唯一性,它自动补全剩余字符;若存在多个匹配项,再次按下 Tab 键,Bash 便会列出所有可能选项,让用户精准选择,有效降低了输入错误概率,使操作更加流畅自如。

为满足任务自动化需求,Bash 赋予了用户强大的脚本编程能力。用户能够将日常重复性任务,像文件备份、软件更新、日志分析等,通过编写 Bash 脚本来实现自动化。借助脚本,系统可以按照预设逻辑、时间节点,有条不紊地执行任务,无需人工反复干预,不仅节省人力,还能确保操作的准确性与一致性,让复杂任务管理变得轻松有序。

考虑到不同用户与项目对系统环境的个性化诉求,Bash 的环境变量功能提供了高度定制化支持。用户可以根据自身工作流程,自由定义诸如 PATH(指定命令搜索路径)、HOME(指向用户主目录)等环境变量,甚至创建专属变量来适配特定软件运行环境。这些变量如同系统运行的 “幕后调控手”,使系统灵活适应多样化任务场景,为用户打造专属的操作空间。

总之,Bash 以其全方位、人性化的设计,将早期 Unix 系统操作的痛点各个击破,成为提升工作效率、实现系统精细管控的得力工具,为用户开启便捷、智能的操作新体验。

三、Bash 的优点是什么

  1. 高效便捷:命令历史记录与命令补全功能大幅减少重复输入与输入错误,上下键翻阅历史命令、Tab 键智能补全,操作一气呵成,如在频繁安装软件、切换目录时,效率显著提升。像查找之前执行过的复杂安装指令,一键调出;输入文件名开头,Tab 补全,让操作流畅无阻。

  2. 强大的任务自动化:Bash 脚本可将日常繁琐任务自动化,从简单的文件备份、批量重命名,到复杂的系统监控、软件部署,几行脚本代码就能按预设逻辑精准执行,无需人工值守,避免人为失误,确保任务准时高质量完成。

  3. 高度定制化:通过环境变量,可依据个人习惯与项目需求定制系统环境,如调整命令搜索路径、为特定软件配置专属环境,让系统运行贴合自身工作流程,为不同场景打造个性化操作空间。

  4. 跨平台兼容性:作为 Linux 和 Mac 系统默认 shell,在服务器管理、开发环境搭建等多场景广泛应用,学习 Bash 能无缝对接不同平台操作,无论是本地开发机还是远程服务器运维,都能轻松驾驭。

  5. 学习成本低:相比一些复杂编程语言,Bash 语法简洁直观,基于大量常用命令组合,新手易上手,短时间学习就能编写实用脚本,快速看到学习成果,激发进一步探索热情。

四、Bash 的缺点是什么

尽管 Bash 优点众多,但它也并非十全十美。

比如,复杂的语法和逻辑处理能力相对较弱,遇到需要深度嵌套、复杂数据结构处理的任务,Bash 脚本可能会显得力不从心,代码也容易变得冗长难读。

与一些专门的编程语言相比,在数学计算、高精度数值处理上,Bash 的表现较为逊色,可能需要借助外部工具来完成复杂运算。

另外,Bash 对多线程编程的支持有限,面对大规模并发任务,难以充分发挥多核处理器的优势,执行效率会大打折扣。

而且,由于不同系统、不同版本的 Bash 可能存在细微差异,脚本的兼容性有时也会成为一个让人头疼的问题,需要花费额外精力去调试适配。

和 Apple Script 一样,sh 语法和我们常用的高级语言的语法差异很大,写一些复杂的逻辑代码还是比较有难度的。反正我是每次写 sh 都需要对照着语法说明去写的,当然,现在有了 AI,就全都靠 AI 去干这个头疼的活了。

使用注意事项:

  1. 注意各种 shell 的配置文件的加载顺序,后面加载的配置会覆盖前面的,也就是说我们可以在 profile 里面覆盖掉 shell 原本的配置。
  2. 我们最常见的环境变量应该是 PATH,这个环境变量是用来告诉 shell 应该去那些目录下寻找我们要执行的命令,这样就不需要每次执行命令都写一长串的 Path。还有一些 JAVA_HOME、ANDROID_HOME 等 HOME 类变量,则是用来指定相应的 SDK 的目录,上层应用在使用时使用这个变量的地址去寻找可执行文件或者配置资源。另外,我们在写一些脚本的时候,可以根据设备去配置不同的变量值,在脚本里获取变量值,这样就不用在每台设备上修改脚本了。
  3. 很多软件执行脚本功能,是不会加载 profile 的配置的,因为它们是处于非登录态,这点一定要注意。比如在 Raycast 里写的脚本,如果需要使用一些非系统的可执行文件,应该都需要使用绝对地址。
  4. shell 终端和 shell 的概念不要搞混,像我们常用的 Terminal、iTerm2、Wrap 等终端,他们只是类似于高级语言的 IDE 的东西,和执行的 shell 基本上是没有关系的,它并不关心你运行的是 Bash,Zsh 或是 Csh。

在之前的[[20250104-Apple Script学习记录]]等多篇文章中有提到,我现在大量的代码都是由我的 AI 雇员替我写的。所以明天把 TA 介绍一下吧,虽然介绍 Cursor 的文章已经满大街都是了,但我也不能因为大家都鼓掌我就不抬手不是