首页 > 解决方案 > 为什么在这个例子中我需要子表达式操作符?

问题描述

一个教科书的例子说

trap {"trapped : $($error[0])"; break}

在 PowerShell 中。为什么我需要子表达式运算符$( )?作为初学者,我会看到

trap {"trapped : $error[0]"; break}

PowerShell 在带双引号的字符串中进行变量替换就足够了。

当然后者是行不通的。为什么?

标签: powershellsubstitution

解决方案


在可扩展字符串(带有外部双引号或已转换为字符串的字符串)内部,变量名被替换为它们的值。此过程忽略索引 ( $var[0]) 和成员访问 ( $var.property),因为变量名[1]中不允许使用.和。[

# Example 1
$var = 'first','second'
$var[1] # retrieves element 1 correctly
second
"$var[1]" # converts $var into a string and then outputs [1] literally
first second[1]

# Example 2
$var = [pscustomobject]@{prop = 'value'}
$var.prop # outputs value as expected
"$var.prop" # converts $var to string and then outputs .prop literally
@{prop=value}.prop

双引号字符串确实评估表达式,但必须告诉解析器表达式包含什么。输入子表达式运算符$()。中的代码()被视为表达式。现在可以识别、评估表达式并将其结果插入到字符串中。

$var = [pscustomobject]@{prop = 'value'}
"$($var.prop)" # outputs value
value

有关其他信息,请参阅About_Quoting_Rules


[1]:变量名中可以使用特殊字符。这在语法的情况下是允许的${variableName}。这种特殊语法在双引号字符串中被正确替换。


推荐阅读