2023-07-11 08:47:30 +08:00
|
|
|
|
[#]: subject: "Bash Basics Series #2: Using Variables in Bash"
|
|
|
|
|
[#]: via: "https://itsfoss.com/bash-use-variables/"
|
|
|
|
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
|
|
|
|
[#]: collector: "lkxed"
|
|
|
|
|
[#]: translator: "geekpi"
|
2023-07-12 11:19:04 +08:00
|
|
|
|
[#]: reviewer: "wxy"
|
|
|
|
|
[#]: publisher: "wxy"
|
|
|
|
|
[#]: url: "https://linux.cn/article-15991-1.html"
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
Bash 基础知识系列 #2:在 Bash 中使用变量
|
|
|
|
|
======
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
![][0]
|
|
|
|
|
|
|
|
|
|
> 在本章的 Bash 基础知识系列中,学习在 Bash 脚本中使用变量。
|
|
|
|
|
|
|
|
|
|
在 Bash 基础知识系列的第一部分中,我简要提到了变量。现在是时候在本章中详细了解它们了。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
如果你曾经进行过任何类型的编码,你一定熟悉术语“变量”。
|
|
|
|
|
|
|
|
|
|
如果没有,请将变量视为保存信息的盒子,并且该信息可以随着时间的推移而改变。
|
|
|
|
|
|
|
|
|
|
让我们看看如何使用它们。
|
|
|
|
|
|
|
|
|
|
### 在 Bash shell 中使用变量
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
打开终端并使用一个随机的数字 4 初始化变量:
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
var=4
|
|
|
|
|
```
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
现在你有一个名为 `var` 的变量,它的值为 `4`。想验证一下吗? **通过在变量名前添加 `$` 来访问变量的值**。这称为参数扩展。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[abhishek@itsfoss]:~$ echo The value of var is $var
|
|
|
|
|
The value of var is 4
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
> 🚧 变量初始化时 `=` 前后不能有空格。
|
|
|
|
|
|
|
|
|
|
如果需要,你可以将该值更改为其他值:
|
|
|
|
|
|
|
|
|
|
![Using variables in shell][1]
|
|
|
|
|
|
|
|
|
|
在 Bash shell 中,变量可以是数字、字符或字符串(包括空格在内的字符)。
|
|
|
|
|
|
|
|
|
|
![Different variable types in Bash shell][2]
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
> 💡 与 Linux 中的其他事物一样,变量名称也区分大小写。它们可以由字母、数字和下划线 “`_`” 组成。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 在 Bash 脚本中使用变量
|
|
|
|
|
|
|
|
|
|
你是否注意到我没有运行 shell 脚本来显示变量示例? 你可以直接在 shell 中做很多事情.当你关闭终端时,你创建的那些变量将不再存在。
|
|
|
|
|
|
|
|
|
|
但是,你的发行版通常会添加全局变量,以便可以在所有脚本和 shell 中访问它们。
|
|
|
|
|
|
|
|
|
|
让我们再写一些脚本.你应该之前创建了脚本目录,但无论哪种情况,此命令都会处理该目录:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
mkdir -p bash_scripts && cd bash_scripts
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
基本上,如果 `bash_scripts` 目录尚不存在,它将创建它,然后切换到该目录。
|
|
|
|
|
|
|
|
|
|
这里让我们使用以下文本创建一个名为 `knock.sh` 的新脚本。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
echo knock, knock
|
|
|
|
|
echo "Who's there?"
|
|
|
|
|
echo "It's me, $USER"
|
|
|
|
|
```
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
更改文件权限并运行脚本。你在上一章中已经学到了。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
这是它为我生成的内容:
|
|
|
|
|
|
|
|
|
|
![Using global variable in Bahs script][3]
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
**你是否注意到它如何自动将我的名字添加到其中?** 这就是包含用户名的全局变量 `$USER` 的魔力。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
你可能还注意到,我有时将 `"` 与 `echo` 一起使用,但其他时候则不使用。这是故意的。[bash 中的引号][4] 有特殊含义。它们可用于处理空格和其他特殊字符。让我展示一个例子。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
### 处理变量中的空格
|
|
|
|
|
|
|
|
|
|
假设你必须使用一个名为 `greetings` 的变量,其值为 `hello and welcome`。
|
|
|
|
|
|
|
|
|
|
如果你尝试像这样初始化变量:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
greetings=Hello and Welcome
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
你会得到这样的错误:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Command 'and' not found, but can be installed with:
|
|
|
|
|
sudo apt install and
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这就是为什么你需要使用单引号或双引号:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
greetings="Hello and Welcome"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
现在你可以根据需要使用该变量。
|
|
|
|
|
|
|
|
|
|
![Using spaces in variable names in bash][5]
|
|
|
|
|
|
|
|
|
|
### 将命令输出分配给变量
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
是的!你可以将命令的输出存储在变量中并在脚本中使用它们。这称为命令替换。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
var=$(command)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这是一个例子:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[abhishek@itsfoss]:~$ today=$(date +%D)
|
|
|
|
|
[abhishek@itsfoss]:~$ echo "Today's date is $today"
|
|
|
|
|
Today's date is 06/19/23
|
|
|
|
|
[abhishek@itsfoss]:~$
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
![Command substitution in bash][6]
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
旧语法使用反引号而不是 `$()` 进行命令替换。虽然它可能仍然有效,但你应该使用新的推荐符号。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
> 💡 变量会更改值,除非你声明一个“常量”变量,如下所示:`readonly pi=3.14`。在这种情况下,变量 `pi` 的值无法更改,因为它被声明为 `readlonly`。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
### 🏋️ 练习时间
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
是时候练习你所学到的东西了。这里有一些练习来测试你的学习情况。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
**练习 1**:编写一个 bash 脚本,以以下格式打印你的用户名、当前工作目录、主目录和默认 shell。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Hello, there
|
|
|
|
|
My name is XYZ
|
|
|
|
|
My current location is XYZ
|
|
|
|
|
My home directory is XYZ
|
|
|
|
|
My default shell is XYZ
|
|
|
|
|
```
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
**提示**:使用全局变量 `$USER`、`$PWD`、`$HOME` 和 `$SHELL`。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
**练习 2:** 编写一个 bash 脚本,声明一个名为 `price` 的变量.使用它来获取以下格式的输出:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Today's price is $X
|
|
|
|
|
Tomorrow's price is $Y
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
其中 X 是变量 `price` 的初始值,并且明天价格翻倍。
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
**提示**:使用 `\` 转义特殊字符 `$`。
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
练习的答案可以在社区的这个专用帖子中讨论。
|
|
|
|
|
|
|
|
|
|
在 Bash 基础知识系列的下一章中,你将了解如何通过传递参数和接受用户输入来使 bash 脚本具有交互性。
|
|
|
|
|
|
2023-07-12 11:19:04 +08:00
|
|
|
|
*(题图:MJ/37c5c26e-3289-4ebd-b8ae-88eb8a3b2eb1)*
|
|
|
|
|
|
2023-07-11 08:47:30 +08:00
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
via: https://itsfoss.com/bash-use-variables/
|
|
|
|
|
|
|
|
|
|
作者:[Abhishek Prakash][a]
|
|
|
|
|
选题:[lkxed][b]
|
|
|
|
|
译者:[geekpi](https://github.com/geekpi)
|
2023-07-12 11:19:04 +08:00
|
|
|
|
校对:[wxy](https://github.com/wxy)
|
2023-07-11 08:47:30 +08:00
|
|
|
|
|
|
|
|
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
|
|
|
|
|
|
|
|
[a]: https://itsfoss.com/author/abhishek/
|
|
|
|
|
[b]: https://github.com/lkxed/
|
|
|
|
|
[1]: https://itsfoss.com/content/images/2023/06/Using-variables-in-shell.png
|
|
|
|
|
[2]: https://itsfoss.com/content/images/2023/06/bash-variables-types.png
|
|
|
|
|
[3]: https://itsfoss.com/content/images/2023/06/using-global-variable-bash-script.png
|
|
|
|
|
[4]: https://linuxhandbook.com:443/quotes-in-bash/
|
|
|
|
|
[5]: https://itsfoss.com/content/images/2023/06/using-spaces-in-bash-variable.png
|
|
|
|
|
[6]: https://itsfoss.com/content/images/2023/06/command-substitue-bash-variable.png
|
2023-07-12 11:19:04 +08:00
|
|
|
|
[0]: https://img.linux.net.cn/data/attachment/album/202307/12/111750bzruv9jiako6j694.jpg
|