给出以下bash代码:
HELLO =${HELLO:-hello}
变量HELLO
从HELLO
环境变量中获取一个值(如果存在)。否则,它将值设置为hello
。
什么是Powershell等效项?
答案 0 :(得分:1)
从Windows PowerShell v5.1 / PowerShell Core 6.1.0开始的PowerShell具有与Bash的parameter expansion功能相同的功能,其中${HELLO:-hello}
是实例的 no sup> [1] 。
注意:
在Bash中,环境变量和Bash自己的 shell变量共享相同的名称空间,环境变量自动作为shell变量公开。
< / li>在PowerShell中,只能直接引用PowerShell的自有变量-例如$myVar
-而引用环境变量需要明确使用{ {1}}名称空间-例如env:
下面的解决方案主要集中在PowerShell的 own 变量上,但是这些技术可以类似地应用于环境变量。
请注意,尽管环境变量始终是 strings ,但是PowerShell变量可以是任何(.NET)类型。
要在PowerShell中模拟$env:PATH
,请使用:
HELLO=${HELLO:-hello}
请注意条件中# To target an *environment* variable, use $env:HELLO instead.
$HELLO = if ("$HELLO") { $HELLO } else { 'hello' }
周围的"..."
,以确保在将值强制转换为 Boolean 之前将其转换为 string [2] :这样,既未定义$HELLO
(或显式包含$HELLO
)的情况,又变量包含空字符串的值评估为$null
,与Bash的行为类似。
如果不使用$False
进行字符串化,则非字符串值(例如"..."
或0
)也会触发$False
分支。
但是,如果只希望else
包含 string 值(如果有),则可以省略$HELLO
。
类似地,以上代码也适用于环境变量,但是由于它们总是字符串,因此在这种情况下,您并不需要严格的"..."
:
"..."
在简单的情况下,将任何$env:HELLO = if ($env:HELLO) { $env:HELLO } else { 'hello' }
的现有值都保留下来,仅在没有前者的情况下才分配默认值:
$HELLO
要模拟if (-not "$HELLO") { $HELLO = 'hello' }
# As an environment variable
if (-not $env:HELLO) { $env:HELLO = 'hello' }
-注意没有HELLO=${HELLO-hello}
-,请使用:
:
这仅涉及$HELLO = if ($null -eq $HELLO) { 'hello' } else { $HELLO }
# Simplified
if ($null -eq $HELLO) { $HELLO = 'hello' }
未定义的情况(并且还明确包含$HELLO
,但这并不常见)。
请注意,$null
被故意用作 LHS ,这是在PowerShell中形成的一个好习惯,如果LHS恰好是一个数组,可以避免出现意外情况,在这种情况下,$null
会执行数组过滤器而不是返回布尔值。
[1]虽然Bash的参数扩展可能永远不会在PowerShell 这样中实现,只是因为它不适合该语言的语法,而是提供了简洁的PowerShell惯用类比正在讨论Bash的-eq
和${HELLO-hello}
,如${HELLO=hello}
和$HELLO ?? 'hello'
-见this GitHub issue。 >
[2] PowerShell使用此简单规则将任何字符串强制为布尔值:如果字符串为 empty ,则其值为$HELLO ?= 'hello'
;如果它是非空的(无论其内容是什么),则其值为$False
。
答案 1 :(得分:0)
最直接的方法是:
$Hello = If($env:hello -eq $null){"WORLD"}else{$env:hello}
或者如果您打算大量使用别名,也可以创建别名
function IfNull($If, $Else){
if($If -eq $Null){
$Else
}else{
$If
}
}
Add-Alias "??" IfNull
$Hello = ?? $env:hello "World2"