问题描述
一个教科书示例说
trap {"trapped : $($error[0])"; break}
在PowerShell中。为什么需要子表达式运算符$( )
?作为一个初学者,我会看到
trap {"trapped : $error[0]"; break}
足够了,因为PowerShell用双引号对字符串进行了变量替换。
当然,后者不起作用。为什么?
解决方法
在可扩展字符串(一个带双引号或已转换为字符串的字符串)内,变量名将替换为其值。此过程将忽略索引($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}
,这是允许的。在双引号字符串中可以正确替换此特殊语法。
变量替换仅在变量名$ error的末尾才出现。
一个人需要 expression 替换来访问此变量的第零个元素,这就是import { Content,Layer,Popup } from 'leaflet';
周围的原因。