前置条件
在开始本教程前,建议您具备:
- 基于 Unix 的操作系统(Linux 或 macOS),或已安装 Git Bash 或 Windows Subsystem for Linux(WSL)的 Windows
- 对终端基本操作的熟悉(打开终端、用
ls列出文件、用cd切换目录) - 用于编写脚本内容的文本编辑器,如 nano、vim 或 VS Code
如何编写 Bash 脚本
我们将从一个简单的 “Hello World” 示例入手,带您开启 bash 脚本之旅。若想更深入学习,请查看 Introduction to Bash Scripting 课程。
步骤 1:创建新的纯文本文件
第一步是创建一个带有 .sh 扩展名的纯文本文件。在 Linux 或 macOS 上,于终端运行:
touch hello_world.sh在 Windows 上,您可以使用 Git Bash 或 Windows Subsystem for Linux(WSL)——二者都支持相同的 touch 命令。或者,也可以在任意文本编辑器(VS Code、记事本、nano)中新建文件,并以 .sh 扩展名保存。
步骤 2:指定解释器
脚本第一行必须指定用哪个解释器来解析脚本。本例中是 Bash。因此需要在脚本的第一行写上 shebang。
#!/bin/bash步骤 3:实现命令
我们的脚本目标是打印 “Hello World!”。为此,请换行并使用 echo 命令,后接要打印的字符串。
echo "Hello World!" 完成后,保存文件并打开 Git Bash。
注意:您可以从 Git 下载页获取 Git Bash。只需选择与您操作系统对应的 Git 版本即可。
接着,运行以下命令:
bash hello_world.sh如图 1 所示,终端应输出 “Hello World!”。

图 1:我们的 Bash 脚本输出
步骤 4:使脚本可执行
与其每次都用 bash 前缀运行脚本,您也可以通过 chmod 让脚本直接可执行:
chmod +x hello_world.sh
./hello_world.shchmod +x 命令为文件授予执行权限。./ 前缀表示让 shell 在当前目录运行该脚本。这是生产环境中分发与运行 bash 脚本的标准方式——大多数脚本都会以这种方式运行。
在 Bash 脚本中获取用户输入
现在您已会编写一个简单的 “Hello World!” 脚本。接下来看看如何用 bash 编写需要用户输入的脚本。在本示例中,我们将创建一个活动生成器:先询问用户姓名,然后从活动数组中随机选择一项,邀请用户参与。
创建文件的步骤与“如何编写 Bash 脚本”一致——不同之处在于我们写入脚本的命令。
- 在终端中新建一个纯文本文件。
touch generate-activity.sh- 在脚本第一行输入 shebang 指定 bash 解释器。
#!/bin/bash- 写入运行脚本所需的命令,然后保存文件。
现在当我们在终端调用该脚本时,应能看到与图 2 相同的输出。
#!/bin/bash
# Greet user and request their name
echo "The activity generator"
read -p "What is your name? " name
# Create an array of activities
activity[0]="Football"
activity[1]="Table Tennis"
activity[2]="8 Ball Pool"
activity[3]="PS5"
activity[4]="Blackjack"
array_length=${#activity[@]} # Store the length of the array
index=$(($RANDOM % $array_length)) # Randomly select an index from 0 to array_length
# Invite the user to join you participate in an activity
echo "Hi" $name, "would you like to play" ${activity[$index]}"?"
read -p "Answer: " answer
图 2:演示 generate-activity.sh 脚本。
在 Bash 脚本中使用变量
变量用于存储可在脚本中引用与复用的数据。定义变量时,赋值的 = 两侧不能有空格。通过在变量名前加上 $ 获取其值:
#!/bin/bash
# Define variables
greeting="Hello"
user_name="Alice"
current_year=$(date +%Y) # Command substitution
# Use variables
echo "$greeting, $user_name!"
echo "The current year is $current_year."Bash 变量的关键规则:
- 变量名区分大小写:
name和NAME是不同的变量 - 赋值时
=两侧不能有空格 - 使用
$(command)进行命令替换,将命令输出捕获到变量中 - 用双引号包裹变量(
"$var")以安全处理包含空格的值
如何在 Bash 脚本中创建函数
在编程中,函数用于将一组重复的指令打包在一起——可参考 Python 中的函数。编写函数的目的在于避免反复书写相同代码,同时也让代码更易读。
Bash 函数可被视为“常规函数”:一组可被多次调用的命令。不过,与多数编程语言相比,bash 函数的能力略有限(例如,bash 函数被调用时不支持返回值)。
在通过函数创建 bash 脚本之前,先看看声明 bash 函数的语法。我们可以通过写出函数名,随后加上小括号和用于包裹函数体的大括号来定义函数——这是编写 bash 函数最常见的方式。代码如下:
# Most common way to write a bash function.
example_function () {
commands
}另一种格式是以 bash 保留关键字 function 开头,然后是函数名和用于包裹函数体的大括号——不需要小括号。
# Another way to write a bash function.
function example_function {
commands
}仅定义函数并不会执行命令。要调用 bash 函数,您必须像下面这样直接写函数名:
#!/bin/bash
# A hello world bash function
hello_world () {
echo "Hello World!"
}
# Invoking the hello_world function
hello_world上面的示例中,我们创建了一个 hello_world 函数,在脚本运行时会打印 “Hello World!”。
向 bash 函数传递参数
参数是在特定函数中使用的变量。在 bash 中,不能像在 Python、Julia 等高级语言中那样以传统方式向函数传参。相反,bash 函数拥有自己的命令行参数,我们在调用函数名后面依次放置参数来传递它们——若有多个参数,使用空格分隔。
本质上,函数参数被视为位置参数,可用 shell 变量($1、$2、...、$n)访问传入函数的参数。
#!/bin/bash
greet () {
echo "Hello $1 $2"
}
greet "John" "Doe" 在上述脚本中,我们向 greet 函数传入了两个参数 John 和 Doe。现在运行脚本,应会看到如下输出:
Hello John Doe在 Bash 脚本中使用循环
循环允许您多次重复执行一段命令。Bash 支持 for 循环和 while 循环。
For 循环
for 循环可遍历一组项目或一个数值范围:
#!/bin/bash
# Loop over a list
for fruit in apple banana cherry; do
echo "I like $fruit"
done
# Loop over a numeric range
for number in {1..5}; do
echo "Number: $number"
doneWhile 循环
while 循环在条件为真时持续运行:
#!/bin/bash
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
count=$((count + 1))
done在 Bash 中编写 If 语句
If 语句是编程语言中的条件语句。如果条件为真,则执行相应代码。这一特性使我们可以控制特定代码在何种情况下执行。
在 bash 中,条件以 if 开始,以 fi(if 的倒写)结束。下面是带有 if 条件的示例脚本:
#!/bin/bash
read -p "Give me a number: " number
if [ $number -gt 10 ];
then
echo "Your number is greater than 10."
fi在上述脚本中,程序会提示用户输入一个数字。如果该数字大于 10,就会在终端输出 “Your number is greater than 10”,否则程序结束。图 3 展示了输入一个大于 10 的数字时的示例。

图 3:在 Bash 脚本中使用 if 语句
结语
Bash 脚本是实现任务自动化、系统管理和构建数据流水线的强大技能。本文覆盖了核心基石:shebang 行、创建与运行脚本、获取用户输入、使用变量、循环、函数与条件语句。
想继续提升 bash 脚本能力,可参考以下路线:
- 学习 Introduction to Bash Scripting 课程,通过动手练习深化技能
- 学习如何使用
cron定时自动运行脚本 - 探索字符串处理、文件 I/O,以及基于退出码的错误处理
- 练习真实场景的自动化脚本:备份、日志轮转、系统健康检查
- 若想更进一步,推荐我们的 Data Processing in Shell 课程
Bash 脚本常见问题
什么是 bash 脚本?
Bash 脚本是包含一系列由 Bash shell 执行的命令的纯文本文件。按惯例以 .sh 扩展名保存,脚本以 shebang 行(#!/bin/bash)开头,用于告知操作系统应使用哪个解释器。脚本用于自动化重复任务、管理文件、运行程序以及执行系统管理操作。
如何运行 bash 脚本?
运行 bash 脚本有两种方式:
- 使用 bash 命令:
bash script.sh——直接运行脚本,无需可执行权限 - 赋予可执行权限:先运行
chmod +x script.sh一次以授予执行权限,然后用./script.sh运行
第二种方法是生产环境中分发与运行脚本的标准做法。
什么是 bash 脚本中的 shebang 行?
Shebang(#!/bin/bash)是 bash 脚本的第一行。它告诉操作系统应使用哪个解释器来执行该文件。#!(“hash-bang”)后面跟的是 Bash 解释器的绝对路径(/bin/bash)。没有 shebang 时,脚本也可能运行,但会使用当前活动的 shell,从而在不同系统之间导致行为不一致。
bash 与 shell 脚本有什么区别?
Shell 脚本是一个广义术语,指在任意 Unix shell(sh、bash、zsh、ksh 等)中运行的脚本。Bash 脚本则特指为 Bash(Bourne Again SHell)编写的脚本。Bash 是大多数 Linux 系统的默认 shell,并在 POSIX shell 标准基础上扩展了数组、算术扩展和高级字符串处理等功能。日常语境中,人们提到“shell 脚本”时,通常指的就是 bash 脚本。
Shell 是一种为操作系统提供交互界面的计算机程序。之所以称为 shell,是因为它像一层“外壳”包在操作系统最外层。
为管理用户与操作系统之间的交互,shell 会提示输入,然后在将接收到的输出返回之前,先为操作系统解释这些输入。根据任务及计算机承担的角色不同,这些输入可以通过命令行界面(CLI)或图形用户界面(GUI)提供。
本质上,shell 使用户和其他程序能够直接与操作系统的各组件通信。
要点速览
.sh扩展名的纯文本文件,内含一系列 shell 命令#!/bin/bashbash script.sh运行;或用chmod +x script.sh赋予可执行权限后以./script.sh运行for/while)和条件语句(if/else)Shell 脚本入门
Shell 脚本是与计算机操作系统沟通的重要方式,也是开发者、系统管理员和数据工程师的一项重要技能。这里的“脚本”指的是将一系列 shell 和操作系统命令写入并存储在文件中:典型操作包括文件处理、程序执行和打印文本等。
学会这一简单流程可以显著节省开发时间,因为某些命令无需反复手动输入——甚至可以将脚本设为自动定时执行。
Unix 和 Linux 用户可用多种不同的 shell。本文其余部分将专注于Bourne Again SHell(bash),它是对Bourne shell 的增强版本,也是 Unix 系操作系统(包括 Linux)最常见的命令行界面之一。
对命令行还不熟悉?建议先学习我们的 Introduction to Shell 课程打好基础,再深入 bash 脚本。
什么是 Bash 脚本?
Bash 是负责与计算机操作系统交互的 Unix 命令行界面。类似电影脚本告诉演员该做什么,bash 脚本也会告诉 bash shell 该执行哪些操作。因此,bash 脚本是一种把命令组合起来、构建程序的实用方式。
您在命令行中能直接执行的任何命令,都可以写入 bash 脚本,并会像在命令行中一样执行。同样,您写入 bash 脚本的任何命令,也都可以直接在命令行中运行,结果应当一致。换句话说,如果您懂得如何用命令行与计算机交互,那么您其实已经掌握了不少 bash 脚本的知识。
主要差异之一在于:bash 脚本是一个按惯例使用
.sh扩展名的纯文本文件(即使没有.sh扩展名,脚本也能运行)。另一个区别是所有脚本第一行的 “shebang”。本质上,shebang 是指向 bash 解释器的绝对路径,由“#”(hash)与“!”(bang)组合后跟 bash shell 路径构成。它用于告诉 Linux 操作系统应使用哪种解释器来解析该文件。