如果你之前学习过其他编程语言,那么对“变量”这个概念一定不陌生。
但对于初学者来说,可以把变量简单地理解为一个“容器”,这个容器用来存放一些可能会变化的信息或数据。
实际上,无论使用哪种编程语言,变量都是基础中的基础。在上一节的Bash入门教程中,我们已经接触过系统预定义的变量,例如 HOME、USER、SHELL。今天,我们将深入探讨如何在你自己编写的 Bash 脚本中定义和使用变量,这是迈向自动化与高效脚本编写的关键一步。
从一个简单的“Hello, World!”脚本开始
回忆一下上一节我们编写的第一个脚本:
#! /bin/bash
echo -n ‘Hello, World!’
这个脚本的功能比较单一。现在,我们来让它变得更“聪明”一点。我们将使用Shell变量来改造它,目标是让脚本能够根据用户输入的名字进行个性化问候。
首先,编辑 hello.sh 脚本,使用 read 命令来获取用户输入:
#! /bin/bash
echo “What’s your name, stranger?”
read name
echo “Hello, $name”
保存并运行这个脚本。它会提示你输入名字,然后使用你提供的名字来打招呼:
./hello.sh
What’s your name, stranger?
Elliot
Hello, Elliot
在演示中,我输入了“Jerry”,脚本便回复了“Hello, Jerry”。瞧,这比干巴巴的“Hello, World!”有趣多了,对吧?

逐行解析脚本逻辑
我们来拆解一下上面这个脚本,看看每一行代码都做了什么:
-
指定解释器:
#!/bin/bash
这一行是“shebang”,它告诉系统使用哪个解释器来执行这个脚本文件。这里我们指定了Bash。
-
输出提示信息:
echo “What’s your name, stranger?”
echo 命令用于在终端打印一行文字,很好理解。
-
读取用户输入:
read name
这是脚本交互的核心。read 命令会等待用户在终端输入,当用户按下回车键后,输入的内容就会被赋值给 name 这个变量。
小技巧:提示输入和获取输入可以合并为一行,这是更进阶的写法:
read -p “What’s your name, stranger?” name
使用 -p 参数可以直接指定提示文本。
-
输出结果:
echo “Hello, $name”
最后,脚本使用用户输入的名字来打招呼。这里的关键是变量名前的美元符号 $,它被称为“解引用操作符”,作用是获取变量 name 中存储的值。如果去掉 $,输出就会变成字面字符串“Hello, name”。
变量的赋值与数据类型
现在,让我们更系统地了解变量。在Bash中,使用等号 = 给变量赋值(注意,等号两边不能有空格)。
例如,创建一个名为 age 的变量并赋值为 27:
age=27
创建后,你可以随时修改变量的值:
age=3
上面的命令将变量 age 的值从 27 更新为 3。
变量可以存储不同类型的数据,如字符串、字符和整数。值得注意的是,Bash本身没有内置的浮点数(带小数点的数字)数据类型。
letter='c'
color='blue'
year=2020
创建只读变量(常量)
有时,你需要一个值不被改变的变量,这就是“常量”或“只读变量”。使用 readonly 命令可以定义它:
readonly PI=3.1415926
上面的命令创建了一个名为 PI 的常量。如果你尝试修改它,会收到错误提示:
bash: PI: readonly variable
如下图所示,常量一旦创建,其值就无法被修改。

强大的特性:命令替换
将一条命令的输出结果直接赋值给变量,这个功能称为“命令替换”。这是 Bash脚本编写 中非常实用且强大的特性。
下面演示如何将 date 命令的输出赋值给变量 TODAY:
TODAY=$(date)
请注意语法:命令 date 被放在 $() 中。执行后,变量 TODAY 中就存储了当前的日期和时间。

还有一种旧的语法使用反引号,但现代写法更推荐使用 $():
TODAY=`date` # 旧式写法,不推荐
variable=$(command) # 推荐的标准写法
再次升级我们的Hello脚本
学会了命令替换,我们可以让脚本变得更“自动化”。之前的版本需要用户手动输入名字,现在,我们可以让脚本通过 whoami 命令自动获取当前用户名并问候。
新的 hello.sh 脚本如下:
#! /bin/bash
echo “Hello, $(whoami)”
看,代码精简到了两行!运行它:
./hello.sh
脚本现在能直接叫出你的系统用户名来打招呼,是不是显得更智能了?

动手练习
实践是巩固知识的最佳方式。以下是一些练习题,建议初学者亲自尝试完成。
练习 1:询问全名
编写一个Shell脚本,询问用户的全名并打印出来。
练习 2:询问年龄
编写一个Shell脚本,询问用户的年龄并打印出来。
- 难度:容易
- 提示:将用户输入作为整数存储到变量中。
练习 3:定义圆周率常量
编写命令,将圆周率PI定义为常量(值为3.14159),并打印它。尝试修改其值以证明它是只读的。
练习 4:获取当前日期
编写一个Shell脚本,将当前日期存储在一个变量中并打印出来。
- 难度:容易
- 提示:使用
date 命令进行命令替换。
练习 5:综合练习
编写一个脚本,依次完成练习1、2、4的任务,每个答案单独一行显示。
输出格式参考如下:
What is your name?
XYZ ABC
Hello XYZ ABC
What is your age?
44
So you are 44.
Today‘s date is Thursday 20 January 2022 12:55:23 PM IST
请将“XYZ ABC”替换为你自己的答案。当然,你也可以将提示语和输出改为中文。
练习题参考答案
答案 1
#! /bin/bash
echo “What’s your full name?”
read name
echo “Hello, $name”
答案 2
#!/bin/bash
echo “What is your age?”
read age
echo “So you are $age years old”
答案 3
$ readonly PI=3.14159
$ echo “Pi value is $PI”
Pi value is 3.14159
$ PI=3.5
bash: PI: readonly variable
答案 4
#!/bin/bash
today=$(date)
echo “Today’s date is $today”
答案 5
#!/bin/bash
echo “What is your name?”
read name
echo “Hello $name”
echo “What is your age?”
read age
echo “So you are $age.”
today=$(date)
echo “Today’s date is $today”
通过以上的学习和练习,你应该已经掌握了Bash中变量的基本用法,包括定义、修改、创建常量以及使用命令替换。这些是构建更复杂、更实用的自动化脚本的基石。如果在实践中遇到问题,欢迎在 云栈社区 与更多开发者交流探讨。