【发布时间】:2012-11-02 03:18:59
【问题描述】:
考虑一下 PowerShell:
PS> $x = 'y'
PS> ($x = 'y')
y
为什么添加括号会导致值被打印?
编辑:一些更有趣的案例:
PS> $z = ($x = 'y')
PS> $z
y
PS> $( $x = $y )
PS> $z = $( $x = $y )
PS> $z
【问题讨论】:
标签: powershell
考虑一下 PowerShell:
PS> $x = 'y'
PS> ($x = 'y')
y
为什么添加括号会导致值被打印?
编辑:一些更有趣的案例:
PS> $z = ($x = 'y')
PS> $z
y
PS> $( $x = $y )
PS> $z = $( $x = $y )
PS> $z
【问题讨论】:
标签: powershell
括号告诉外壳程序先计算括号内的值,然后打印结果。在您的第一个命令中,它是分配;然而,第二个是一个将被评估并打印结果的命令,即'y'
更新
PS> $z = ($x = 'y') # assignment, no print , ($x = 'y') returns 'y'
PS> $z
y
PS> $( $x = $y ) # this is a voidable expression whose result is discarded when used directly as a statement. so, $( $x = $y ) -eq $null
PS> $z = $( $x = $y ) # same to above
PS> $z
“PowerShell in Action”指出子表达式构造和简单括号之间的区别在于如何处理可撤销语句。 ++,--,+=,-= 操作也被视为可撤销语句。
在简单的括号 () 中,可撤销语句不被丢弃,但在子表达式 $() 中,它们被丢弃。
【讨论】:
具有副作用的表达式在用作语句时通常不会返回其结果。例如:
PS> $x = $a++
显然,$a++ 必须有一个值才能使其工作。然而:
PS> if (...) $a++
您不希望它打印出$a 的值。所以结果被丢弃了。
分组括号会覆盖此行为,并强制将结果返回到管道,即使它是可撤销的:
PS> ($x = 'y')
'y'
另一方面,要使不可撤销的表达式无效,请将其转换为 void 或通过管道将其转换为 Out-Null:
PS> mkdir Foo | Out-Null
PS> [void](mkdir Bar)
所以问题Why it needs an extra pair of bracket?
Windows PowerShell Language Specification - 7.1.1 分组括号,但它们不使用“可撤销表达式”术语。
【讨论】: