什么是var=${var:-word}bash在powershell中的等价物

什么是var=${var:-word}bash在powershell中的等价物,bash,powershell,Bash,Powershell,给定此bash代码: HELLO =${HELLO:-hello} 变量HELLO从HELLO环境变量(如果存在)中获取一个值。否则,它将值设置为hello Powershell的等效功能是什么?最直接的方法是: $Hello = If($env:hello -eq $null){"WORLD"}else{$env:hello} 或者,如果您计划大量使用别名,也可以使用它 function IfNull($If, $Else){ if($If -eq $Null){

给定此bash代码:

HELLO =${HELLO:-hello}
变量
HELLO
HELLO
环境变量(如果存在)中获取一个值。否则,它将值设置为
hello


Powershell的等效功能是什么?

最直接的方法是:

$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"

自Windows PowerShell v5.1/PowerShell Core 6.1.0起,PowerShell没有与Bash功能等效的功能,其中
${HELLO:-HELLO}
是一个实例[1]

注意:

  • 在Bash中,环境变量和Bash自己的shell变量共享同一名称空间,并且环境变量自动公开为shell变量

  • 在PowerShell中,只能直接引用PowerShell自己的变量-例如,
    $myVar
    -而引用环境变量需要显式使用
    env:
    命名空间-例如,
    $env:PATH

下面的解决方案主要关注PowerShell自身的变量,但这些技术也可以类似地应用于环境变量。
请注意,虽然环境变量始终是字符串,但PowerShell变量可以是任何(.NET)类型


要在PowerShell中模拟
HELLO=${HELLO:-HELLO}
,请使用:

# To target an *environment* variable, use $env:HELLO instead.
$HELLO = if ("$HELLO") { $HELLO } else { 'hello' }
请注意条件中围绕
$HELLO
“…”
,它确保在将值强制转换为布尔值之前将其转换为字符串[2]:这样,未定义
$HELLO
的情况(或显式包含
$null
)并且包含空字符串的变量计算为
$False
,这与Bash的行为类似

如果不使用
“…”
,非字符串值,如
0
$False
也将触发
else
分支。
但是,如果您只希望
$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
,但这并不常见)

请注意,
$null
故意用作LHS,这是在PowerShell中形成的一个好习惯,以避免LHS恰好是一个数组时出现意外,在这种情况下,
-eq
充当数组过滤器,而不是返回布尔值


[1] 虽然Bash的参数扩展可能永远不会在PowerShell中实现,这仅仅是因为它不是一种适合该语言的好语法,它提供了与Bash的
${HELLO HELLO}
${HELLO=HELLO}
的简明的PowerShell惯用类比,正如
$HELLO你好“
$hello?='hello'
-请参阅

[2] PowerShell使用以下简单规则将任何字符串强制为布尔值:如果字符串为空,则其计算结果为
$False
;如果它是非空的-无论其内容如何-它的计算结果为
$True