在 Bash 中使用变量

通过我们的迷你系列:Shell 中的变量,充分利用 Bash 变量。
181 位读者喜欢这篇文章。
bash logo on green background

Opensource.com

在计算机科学(和日常计算)中,变量是内存中的一个位置,用于保存任意信息以供以后使用。换句话说,它是一个临时的存储容器,供您将数据放入和取出。在 Bash shell 中,该数据可以是单词(计算机术语中的字符串)或数字(整数)。

您可能以前从未使用过(有意识地)计算机上的变量,但您可能在生活的其他领域中使用过变量。当您说“给我那个”或“看看这个”之类的话时,您正在使用语法变量(您将它们视为代词),因为“这个”和“那个”的含义取决于您脑海中想象的任何东西,或者您指向的任何东西,以便您的听众知道您指的是什么。当您进行数学运算时,您使用变量来代表未知值,即使您可能不称其为变量。

这是一个快速简便的 Bash 变量演示,您可能没有意识到自己每天都在使用它。PS1 变量保存有关您希望终端提示符如何显示的信息。例如,您可以通过重新定义 PS1 变量将其设置为非常简单的内容(例如百分号 %

$ PS1="% "
% 

本文讨论在 Linux、BSD、Mac 或 Cygwin 上运行的 Bash shell 中的变量。Microsoft 开源 PowerShell 的用户应参考我的关于 PowerShell 中的变量 的文章。

变量有什么用?

您是否需要在 Bash 中使用变量取决于您在终端中执行的操作。对于某些用户来说,变量是管理数据的重要手段,而对于另一些用户来说,它们是次要的和临时的便利,而对于还有一些用户来说,它们可能根本不存在。

最终,变量是一种工具。当您找到它们的用途时可以使用它们,或者在知道它们由您的操作系统管理的情况下将它们放在一边。然而,知识就是力量,了解变量在 Bash 中的工作方式可以引导您进行各种意想不到的创造性问题解决。

如何设置变量

您不需要特殊权限即可创建变量。它们可以自由创建、自由使用,并且通常是无害的。在 Bash shell(在 Linux 和 Mac 上)中,您可以通过定义变量名,然后设置其值来设置它们。以下示例创建一个名为 FOO 的新变量,并将值设置为字符串 /home/seth/Documents

$ declare FOO="/home/seth/Documents"

成功是异常沉默的,因此您可能不确信您的变量已设置。您可以使用 echo 命令 查看结果,方法是在变量前加上美元符号 ($) 来调用您的变量。为了确保变量完全按照您的定义读取,您还可以将其括在花括号和引号中。这样做可以保留变量中可能出现的任何特殊字符;在本例中,这不适用,但这仍然是一个很好的习惯

$ echo "${FOO}"
/home/seth/Documents

设置变量对于经常使用 shell 的人来说可能是一件常见的事情,因此该过程已经变得有些非正式。当字符串后跟等号 (=) 和值时,Bash 会默默地假设您正在设置变量,从而使 declare 关键字变得不必要

$ FOO="/home/seth/Documents"

变量通常旨在将信息从一个系统传送到另一个系统。在这个简单的示例中,您的变量不是很实用,但它仍然可以传达信息。例如,由于 FOO 变量的内容是 文件路径,因此您可以使用该变量作为 ~/Documents 目录的快捷方式

$ pwd
/home/seth
$ cd "${FOO}"
$ pwd
/home/seth/Documents

变量可以是任何非保留字符串(以及整数和下划线)。它们不必大写,但它们通常是大写的,以便于识别为变量。

如何清除变量

您可以使用 unset 命令清除变量

$ unset FOO
$ echo $FOO 

实际上,此操作通常不是必需的。变量相对“廉价”,因此您可以创建它们,然后在不需要它们时忘记它们。但是,有时您可能希望确保变量为空,以避免将不正确的信息传递给可能读取该变量的另一个进程。

创建具有冲突保护的新变量

有时,您可能有理由相信变量已由您或进程设置。如果您不想覆盖它,则有一种特殊的语法将变量设置为其现有值,除非其现有值为空。

对于此示例,假设 FOO 设置为 /home/seth/Documents

$ FOO=${FOO:-"bar"}
$ echo $FOO
/home/seth/Documents

冒号-破折号 :- 表示法使 declare 默认为现有值。要查看此过程的另一种方式,请清除变量,然后重试

$ unset FOO
$ echo $FOO

$ FOO=${FOO:-"bar"}
$ echo $FOO
bar

将变量传递给子进程

当您创建变量时,您正在创建所谓的局部变量。这意味着该变量对您当前的 shell 和仅您当前的 shell 是已知的。

此设置是变量作用域的有意限制。根据设计,变量倾向于默认仅在本地可用,以尝试在需要知道的基础上保持信息共享。例如,如果您愚蠢地创建了一个以明文形式包含重要密码的变量,那么很高兴知道您的系统不允许远程 shell 或恶意守护程序(或创建变量的会话之外的任何其他内容)访问该密码。

使用本文开头的示例来更改您的提示符,然后在当前 shell 中启动一个新 shell

$ PS1="% "
% bash
$ 

当您启动新 shell 时,PS1 的新值是默认提示符,而不是您的新提示符:子进程不会继承在其父进程中设置的变量。如果您终止子进程,您将返回到父 shell,并且您会再次看到您的自定义 PS1 提示符

$ exit
% 

如果您想将变量传递给子进程,您可以在命令前添加变量定义,或者您可以将变量导出到子进程。

前置变量

您可以在运行命令之前前置任意数量的变量。变量是否被子进程使用取决于进程,但您可以将变量传递给它,无论如何

$ FOO=123 bash
$ echo $FOO
123
$ 

当您运行需要特定库位置的应用程序(使用 LD_LIBRARY_PATH 变量)时,或者当您使用非标准编译器(使用 CC 变量)编译软件时,前置可能是一个有用的技巧,等等。

导出变量

使变量可用于子进程的另一种方法是 export 关键字,这是一个内置于 Bash 的命令。export 命令扩大了您指定的任何变量或变量的范围

$ PS1="% "
$ FOO=123
$ export PS1
$ export FOO
% bash
% echo $PS1
%
% echo $FOO
123

在这两种情况下,不仅子 shell 可以访问已传递给它或导出的局部变量,而且该 shell 的任何子进程都可以访问。您可以从同一 shell 启动应用程序,并且该变量可以作为应用程序中的环境变量使用。

为系统上所有内容导出的变量称为环境变量,这是未来文章的主题。同时,尝试为日常任务使用一些变量,看看它们为您的工作流程带来什么。

接下来阅读

您离不开的 Bash 别名

厌倦了一遍又一遍地输入相同的长命令?您是否觉得在命令行上工作效率低下?Bash 别名可以带来天壤之别。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,经常同时工作。

评论已关闭。

© . All rights reserved.