什么是var=${var:-word}bash在powershell中的等价物
给定此bash代码:什么是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){
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变量可以是任何(.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