在计算机科学(和日常计算)中,变量是内存中的一个位置,用于存储任意信息以供以后使用。换句话说,它是一个临时的存储容器,供您将数据放入和取出。在 Bash shell 中,该数据可以是单词(计算机术语中的字符串)或数字(整数)。
您可能以前从未(有意识地)在计算机上使用过变量,但您可能在生活的其他领域使用过变量。当您说“给我那个”或“看看这个”之类的话时,您正在使用语法变量(您将它们视为代词)。 “这个”和“那个”的含义取决于您脑海中想象的内容,或者您指向的任何内容作为指示器,让您的听众知道您指的是什么。当您进行数学运算时,您使用变量来代表未知值,即使您可能不称它们为变量。
本文讨论了 PowerShell 中的变量,它在 Windows、Linux 或 Mac 上运行。开源 Bash shell 的用户应参考我关于 Bash shell 中变量的文章(尽管您可以在 Linux 上运行 PowerShell,并且它是开源的,因此您仍然可以继续阅读本文)。
注意: 本文中的示例来自在开源操作系统 Linux 上运行的 PowerShell 会话,因此如果您在 Windows 或 Mac 上,则文件路径会有所不同。但是,Windows 会自动将 / 转换为 \ ,并且所有示例都适用于所有平台,前提是您替换明显的差异(例如,您的用户名不太可能是 seth)。
变量有什么用?
您是否需要在 PowerShell 中使用变量取决于您在终端中执行的操作。对于某些用户来说,变量是管理数据的重要手段,而对于另一些用户来说,它们是次要的和临时的便利,或者对于某些人来说,它们可能根本不存在。
归根结底,变量是一种工具。当您找到它们的用途时可以使用它们,或者在知道它们由您的操作系统管理的情况下将它们放在一边。然而,知识就是力量,了解变量在 Bash 中的工作方式可以引导您进行各种意想不到的创造性问题解决。
设置变量
您不需要特殊权限即可创建变量。它们可以免费创建、免费使用,并且通常是无害的。在 PowerShell 中,您可以通过定义变量名,然后使用 Set-Variable 命令设置其值来创建变量。下面的示例创建一个名为 FOO 的新变量,并将其值设置为字符串 $HOME/Documents
PS> Set-Variable -Name FOO -Value "$HOME/Documents"
成功是异常沉默的,因此您可能不确信您的变量已设置。您可以使用 Get-Variable(简写为 gv)命令亲自查看结果。为了确保变量完全按照您定义的方式读取,您还可以将其用引号括起来。这样做可以保留变量中可能出现的任何特殊字符;在本例中,这不适用,但仍然是一个值得养成的习惯
PS> Get-Variable "FOO" -valueOnly
/home/seth/Documents
请注意,FOO 的内容与您设置的内容不完全相同。您为变量设置的文字字符串是 $HOME/Documents,但现在它显示为 /home/seth/Documents。发生这种情况是因为您可以嵌套变量。 $HOME 变量指向当前用户的主目录,无论它是在 Windows 上的 C:\Users、Linux 上的 /home 还是 Mac 上的 /Users 中。由于 $HOME 嵌入在 FOO 中,因此在调用时该变量会被展开。以这种方式使用默认变量有助于您编写可在跨平台操作的可移植脚本。
变量通常旨在将信息从一个系统传递到另一个系统。在这个简单的示例中,您的变量不是很有用,但它仍然可以传达信息。例如,由于 FOO 变量的内容是文件路径,因此您可以使用 FOO 作为其值引用的目录的快捷方式。
要引用变量 FOO 的内容而不是变量本身,请在变量前加上美元符号 ($)
PS> pwd
/home/seth
PS> cd "$FOO"
PS> pwd
/home/seth/Documents
清除变量
您可以使用 Remove-Variable 命令删除变量
PS> Remove-Variable -Name "FOO"
PS> gv "FOO"
gv : Cannot find a variable with the name 'FOO'.
[...]
在实践中,通常不需要删除变量。变量相对“便宜”,因此您可以在不需要它们时创建它们并忘记它们。但是,有时您可能希望确保变量为空,以避免将不必要的信息传递给可能读取该变量的另一个进程。
创建具有冲突保护的新变量
有时,您可能有理由相信变量已被您或其他某些进程设置。如果您不想覆盖它,您可以选择使用 New-Variable,它被设计为在具有相同名称的变量已存在时失败,或者您可以使用条件语句首先检查变量
PS> New-Variable -Name FOO -Value "example"
New-Variable : A variable with name 'FOO' already exists.
注意: 在这些示例中,假设 FOO 设置为 /home/seth/Documents。
或者,您可以构造一个简单的 if 语句来检查现有变量
PS> if ( $FOO )
>> { gv FOO } else
>> { Set-Variable -Name "FOO" -Value "quux" }
添加到变量
您可以添加到现有变量,而不是覆盖变量。在 PowerShell 中,变量具有多种类型,包括字符串、整数和数组。当选择创建具有本质上多个值的变量时,您必须决定是否需要字符分隔的字符串或数组。您可能并不关心其中一种方式,但接收变量数据的应用程序可能期望其中一种方式,因此请根据您的目标做出选择。
要将数据附加到字符串变量,请使用 += 语法
PS> gv FOO
foo
PS> $FOO += ",bar"
PS> gv FOO
foo,bar
PS> $FOO.getType().Name
String
数组是 PowerShell 中的特殊变量类型,需要 ArrayList 对象。这超出了本文的范围,因为它需要深入研究 PowerShell 的 .NET 内部结构。
使用环境变量全局化
到目前为止,本文中创建的变量都是局部变量,这意味着它们仅适用于您在其中创建它们的 PowerShell 会话。要创建其他进程可以访问的变量,您可以创建环境变量,这将在以后的文章中介绍。
6 条评论