考慮此位的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
括號告訴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在行動」規定的子表達式結構和簡單的括號之間的區別在於如何可撤銷聲明被治療。 ++, - ,+ =, - =操作也被視爲可空的語句。
在簡單圓括號()中,可丟棄語句不會被丟棄,但是在子表達式$()中,它們將被丟棄。
帶有副作用的表達式在用作語句時通常不會返回結果。例如:
PS> $x = $a++
很明顯,$a++
必須有一個值才能工作。但是:
PS> if (...) $a++
您不希望此值打印出$a
的值。所以結果被丟棄。
分組圓括號覆蓋此行爲,並強制將結果返回到管道,即使是可撤銷的:
PS> ($x = 'y')
'y'
在另一方面,作廢非可撤銷的表達,無論是將其轉換爲void
或管道它Out-Null
:
PS> mkdir Foo | Out-Null
PS> [void](mkdir Bar)
SO質疑Why it needs an extra pair of bracket?
的Windows PowerShell Language Specification - 7.1.1分組圓括號,但他們不使用 「可撤銷的表達」 的術語。
「PowerShell in Action」使用「無效表達式」,其作者負責MS中的powershell。我只是複製它。 :-) – Jackie
「可撤銷的表達」 是關鍵,謝謝! –