为什么括号会导致赋值产生结果?

时间:2012-11-02 03:18:59

标签: powershell

考虑一下PowerShell:

PS> $x = 'y'
PS> ($x = 'y')
y

为什么添加parens导致值被打印?

编辑:一些更有趣的案例:

 PS> $z = ($x = 'y')
 PS> $z
 y
 PS> $( $x = $y )
 PS> $z = $( $x = $y )
 PS> $z

2 个答案:

答案 0 :(得分:2)

括号告诉shell先评估括号内的值,然后打印结果。在你的第一个命令中,它的任务;但是,第二个是将被评估并打印结果的命令,即'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”表示子表达式构造与简单括号之间的区别在于如何处理可置空的语句。 ++, - ,+ =, - =操作也被视为voidable语句。

在简单的括号()中,不会丢弃voidable语句,但在子表达式$()中,它们将被丢弃。

答案 1 :(得分:1)

带有副作用的表达式在用作语句时通常不会返回其结果。例如:

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分组括号,但它们不使用“voidable expression”术语。

博客帖子 PowerShell ABC's - V is for Voidable Statements