bash变量里包含变量
在计算机科学(和休闲计算)中,变量是内存中的位置,用于保存任意信息以供以后使用。 换句话说,这是一个临时存储容器,供您将数据放入和取出数据。 在Bash shell中,该数据可以是单词(以计算机术语为单位的字符串 )或数字( 整数 )。
您可能以前从未(知道)在计算机上使用过变量,但是您可能在生活的其他领域使用过变量。 当您说“给我那个”或“看看这个”之类的内容时,您使用的是语法变量(您将它们视为代词 ),因为“ this”和“ that”的含义取决于您所描绘的内容在您的脑海中,或者您指的是什么,以便您的听众知道您指的是什么。 在进行数学运算时,即使您可能不将其称为变量,也可以使用变量来代表未知值。
这是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会悄悄地假定您正在设置变量,从而使clarify关键字变得不必要:
$ 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
冒号:-表示导致声明默认为现有值。 要以其他方式查看此过程,请清除变量,然后重试:
$
unset FOO
$
echo
$FOO
$
FOO =
${FOO:-"bar"}
$
echo
$FOO
bar
将变量传递给子进程
创建变量时,您正在创建所谓的局部变量 。 这意味着该变量对于您当前的shell来说是已知的,而只有您当前的shell知道。
此设置是对变量范围的有意限制。 根据设计,变量倾向于默认为仅本地可用,以使信息在需要知道的基础上保持共享。 例如,如果您愚蠢地创建了一个包含重要密码的明文变量,那么很高兴得知您的系统不允许远程shell或流氓守护进程(或在创建该变量的一个会话之外的任何其他程序)访问该密码。 。
使用本文开头的示例更改您的提示,然后在当前窗口中启动一个新的shell:
$
PS1 =
"% "
%
bash
$
当启动新的Shell时, PS1的新值是默认提示,而不是新提示:子进程不会继承其父进程中设置的变量。 如果终止子进程,则返回到父外壳,然后再次看到自定义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的任何子进程。 您可以从同一外壳启动应用程序,并且该变量可以在应用程序中作为环境变量使用。
导出供系统上所有内容使用的变量称为环境变量 ,这是以后文章的主题。 同时,尝试对日常任务使用一些变量,以查看它们为您的工作流带来了什么。
翻译自: https://opensource.com/article/19/8/using-variables-bash
bash变量里包含变量