考虑一下 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:
PS> $x = 'y'
PS> ($x = 'y')
y
为什么添加括号会导致值被打印?
编辑:一些更有趣的案例:
PS> $z = ($x = 'y')
PS> $z
y
PS> $( $x = $y )
PS> $z = $( $x = $y )
PS> $z
括号告诉外壳程序首先评估括号内的值,然后打印结果。在您的第一个命令中,它是分配;然而,第二个是一个将被评估并打印结果的命令,即'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)
所以问题为什么它需要一对额外的支架?
Windows PowerShell 语言规范- 7.1.1 分组括号,但它们不使用“可撤销表达式”术语。