下面的PowerShell腳本爲什麼它需要一對額外的支架?
"one","two","three" | % { "$(($l++)): $_" }
將打印
1: one 2: two 3: three
然而,在去除周圍$l++
"one","two","three" | % { "$($l++): $_" }
支架,將打印
: one : two : three
下面的PowerShell腳本爲什麼它需要一對額外的支架?
"one","two","three" | % { "$(($l++)): $_" }
將打印
1: one 2: two 3: three
然而,在去除周圍$l++
"one","two","three" | % { "$($l++): $_" }
支架,將打印
: one : two : three
這是因爲$l++
是可撤銷聲明。在powershell中,某些類型的 表達式在用作語句時不會顯示。 可變語句包括賦值和增量/減量運算符。當它們在表達式中使用時,它們會返回一個值,但是當它們用作獨立語句時,它們不會返回任何值。這是很好的Windows PowerShell中通過布魯斯·帕耶特解釋行動:
遞增和遞減運營商幾乎不包含在PowerShell中 ,因爲他們推出的一個問題。在諸如C和C#的語言中,當您使用 其中一個運算符作爲語句時: $ a ++ 不顯示任何內容。這是因爲C和C#語句不返回值。但是,在PowerShell的 中,所有語句都會返回一個值。這導致了混亂。人們 會寫腳本這樣的:
$sum=0
$i=0
while ($i -lt 10) { $sum += $i; $i++ }
$sum
和驚訝1至10顯示看到的數字。這是因爲$ a ++ 返回了一個值,PowerShell顯示了每條語句的結果。這個 非常混亂,我們幾乎將這些操作符從語言中刪除。然後我們 打了一個可以無效的陳述的想法。基本上,這意味着某些類型的 表達式在用作語句時不會顯示。無效的陳述包括 賦值和增量/減量運算符。當它們在 表達式中使用時,它們會返回一個值,但是當它們用作獨立語句時,它們將不會返回任何值。同樣,這是其中的一個細節,不會影響您使用PowerShell的方式,而不會影響您的預期效果。 (來源:Windows Powershell在行動)
我認爲很多人的最佳答案:) – manojlds
在Deep Dive中,Bruce也提到這是if語句和循環的工作原理:if($ foo = Get-RandomTrueFalse){「This can run !「} – JasonMArcher
我認爲有需要做兩項工作:它發生在內部括號
$l
的值,它發生在外層的括號
$l++
(增加變量)。這裏就是一個例證:
$l = 0
"$($l++ ; $l)"
輸出:1
其中
$l = 0
"$($l++)"
不輸出任何東西。
爲了接收輸出,我需要在子表達式中使用兩條語句。否則,唯一發生的是$l
遞增,但其值不被檢索。
我相信這是由PowerShell團隊做出的設計決策,以避免由於PowerShell輸出返回值而導致的意外。許多C/C#人會期望以下函數只輸出1而不是@(0,1)。
function foo {
$i = 0
$i++
$i
}
所以命題形式$i++
做的$我不能輸出值遞增前。如果你想要的行爲,PowerShell允許通過直接把遞增(或遞減)語句表達例如爲:
function foo {
$i = 0
($i++)
$i
}
內獲得這種行爲這將輸出@(0,1)。
Bruce Payette在Windows PowerShell in Action 2nd Edition的第5章中對此進行了討論。遞增和遞減操作符是「可撤銷的語句」。從書中引用:
基本上,這意味着某些類型的表達式在用作 語句時不會顯示。無效的陳述包括分配 陳述和增量/減量運算符。當在表達式中使用遞增和遞減時,它們會返回一個值,但是當它們用作獨立語句時,它們不返回任何值。
這是因爲$l++
不返回任何東西,:
$l = 0
$l++ #nothing
$l #gives 1
$l++ #nothing
($l++) #gives 2
這樣做的目的有是當你正在返回管道沒有混亂。實際上,
$l++
是$l = $l+ 1
,所以它不返回任何東西。
你想看到的是$l = $l + 1; $l
,這就是爲什麼你必須做($l++)
。
哦,你有這個社區的孩子! :-) –