PowerShell变量有多种形式( 类型 )。本书篇幅有限,无法一一介绍PowerShell的数据类型。你只需要知道,PowerShell有多种数据类型,包括布尔值、字符串和整数,而且修改变量的数据类型不会报错。下列代码可以正常运行,没有错误。
PS> $foo = 1
PS> $foo = 'one'
PS> $foo = $true
这是因为PowerShell能根据变量的值确定数据类型。背后的原理有点儿复杂,超出了本书范畴。你要做的是了解基本的类型以及类型之间的关系。
大多数编程语言会使用
布尔值
。该类型有两个值,真值(1)和假值(0)。布尔值用于表示双值条件,就像电灯开关那样,可开可关。在PowerShell中,布尔值称作bools,两个值分别使用自动变量
$true
和
$false
表示。这两个自动变量被写“死”在了PowerShell中,不可修改。代码清单2-11展示了如何将变量的值设为
$true
或
$false
。
代码清单2-11 创建布尔值变量
PS> $isOn = $true
PS> $isOn
True
第4章将多次使用布尔值。
PowerShell中的数字主要使用两种方式表示:整数数据类型和浮点数数据类型。
整数数据类型只存储整数,小数部分会四舍五入为最近的整数。整数数据类型分为 带符号 和 不带符号 两种。带符号的整数数据类型既可以存储正数,也可以存储负数;不带符号的整数数据类型则只能存储没有正负号的值。
在默认情况下,PowerShell会使用32位带符号的
Int32
类型存储整数。位数决定了一个变量可以存储多大(或多小)的数,
Int32
可存储的整数范围为 -2 147 483 648到2 147 483 647。如果一个数在此范围之外,可以使用64位带符号的
Int64
类型,该类型的范围为 -9 223 372 036 854 775 808到9 223 372 036 854 775 807。
代码清单2-12举例说明了PowerShell如何处理
Int32
类型。
代码清单2-12
用
Int32
类型存储不同的值
PS> $num = 1 ❶
PS> $num
1
PS> $num.GetType().name ❷
Int32
PS> $num = 1.5 ❸
PS> $num.GetType().name
Double
PS> [Int32]$num ❹
2
下面来一步一步地分析。先别担心句法,目前我们关注的是输出。首先,创建变量
$num
,并将值设为1❶。然后,检查
$num
的类型❷,发现PowerShell使用
Int32
类型表示1。接下来,修改
$num
的值,改成一个小数❸,再次检查类型,发现PowerShell将该变量的类型改成了
Double
。这是因为PowerShell会根据变量的值确定变量的类型。但可以强制PowerShell将变量视作某种类型,这叫
类型校正
。最后,在
$num
前面加上
[Int32]
句法❹,这就是类型校正。可以看到,如果强制将1.5视作整数,则PowerShell会将其四舍五入为2。
接下来将介绍
Double
类型。
Double
是一种范围更广的变量类型,称作
浮点数
变量。浮点数也可用于表示整数,但最常用于表示小数。此外,浮点数变量的另一种类型是
Float
。本书不详述
Float
和
Double
类型的内部表示,你只需要知道,虽然二者都可以表示小数,但精度不同,如代码清单2-13所示。
代码清单2-13 浮点数类型的精度误差
PS> $num = 0.1234567910
PS> $num.GetType().name
Double
PS> $num + $num
0.2469135782
PS> [Float]$num + [Float]$num
0.246913582086563
可以看到,PowerShell默认使用
Double
类型。注意,将
$num
与自身相加,并将类型校正为
Float
后,结果有点儿奇怪。同样,这背后的原因超出了本书范畴。需要记住的是,使用
Float
和
Double
会产生这样的误差。
前面已经见过这种类型的变量。在代码清单2-4中定义
$color
变量时,我们没有直接输入
$color = blue
,而是将值放在一对单引号中,以告诉PowerShell这是一系列字母,即
字符串
。如果不将
blue
放在一对引号中就赋值给
$color
,那么PowerShell会报错。
S> $color = blue
blue : The term 'blue' is not recognized as the name of a cmdlet, function, script file, or
operable program. Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
At line:1 char:10
+ $color = blue
+ ~~~~
+ CategoryInfo : ObjectNotFound: (blue:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
如果没有引号,那么PowerShell会将
blue
解释为一个命令,并尝试执行该命令。由于
blue
命令不存在,因此PowerShell会返回一个错误消息来说明原因。正确定义字符串的方法是在值两侧加上引号。
字符串不一定是单词,还可以是短语或句子。例如,可以将下列字符串赋值给
$sentence
变量。
PS> $sentence = "Today, you learned that PowerShell loves the color blue"
PS> $sentence
Today, you learned that PowerShell loves the color blue
有时我们想将这句话中的PowerShell和blue两个词当作变量的值。例如,有一个变量名为
$name
,另一个变量名为
$language
,还有一个变量名为
$color
。代码清单2-14使用其他变量定义了
$sentence
变量。
代码清单2-14 在字符串中插入变量
PS> $language = 'PowerShell'
PS> $color = 'blue'
PS> $sentence = "Today, you learned that $language loves the color $color"
PS> $sentence
Today, you learned that PowerShell loves the color blue
注意,这里使用的是双引号。如果将句子放在单引号中,则得不到预期结果。
PS> 'Today, $name learned that $language loves the color $color'
Today, $name learned that $language loves the color $color
这不是诡异的bug,而是因为PowerShell中的单引号和双引号有重要区别。
将简单的字符串赋值给变量时,使用单引号或双引号都可以,如代码清单2-15所示。
代码清单2-15 使用单引号和双引号来修改变量的值
PS> $color = "yellow"
PS> $color
yellow
PS> $color = 'red'
PS> $color
red
PS> $color = ''
PS> $color
PS> $color = "blue"
PS> $color
blue
可以看到,定义简单的字符串时,使用哪种引号无关紧要。那么为什么在字符串中有变量时却有区别呢?答案藏在
变量内插
(或称作
变量扩展
)机制中。通常来说,在控制台中输入
$color
后按回车键,PowerShell会
内插
(或
扩展
)变量。虽然这两个术语听起来很高深,但其实就是PowerShell将变量中的值读取出来,或者说打开盒子,让你看到里面的东西。在双引号中调用变量的原理是一样的:变量得到扩展,如代码清单2-16所示。
代码清单2-16 字符串中的变量行为
PS> "$color"
blue
PS> '$color'
$color
请注意使用单引号时的情况:控制台会输出变量自身,而不是它的值。在PowerShell看来,单引号意味着保持不变,输入什么就显示什么,不管是blue这样的词,还是
$color
这样看起来像是变量的内容。对PowerShell来说,二者是相同的,不会对单引号中的值做特殊处理。PowerShell不会将单引号中的变量扩展为变量的值。因此,在字符串中插入变量时,需要使用双引号。
布尔值、整数和浮点数相关的知识还有很多,我们暂时停下脚步,介绍一下更为一般的概念:对象。