在Powershell中,什么是var = $ {var:-word} bash等效项

时间:2018-10-01 01:46:46

标签: bash powershell

给出以下bash代码:

HELLO =${HELLO:-hello}

变量HELLOHELLO环境变量中获取一个值(如果存在)。否则,它将值设置为hello

什么是Powershell等效项?

2 个答案:

答案 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"
相关问题