что такое var = $ {var: -word} bash-эквивалент в powershell - PullRequest
0 голосов
/ 01 октября 2018

Учитывая этот код bash:

HELLO =${HELLO:-hello}

переменная HELLO принимает значение из переменной окружения HELLO, если она существует.В противном случае он устанавливает значение равным hello.

Что такое эквивалент Powershell?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

PowerShell, начиная с Windows PowerShell v5.1 / PowerShell Core 6.1.0, обладает нет функциональностью, эквивалентной расширению параметра Bash , из которых ${HELLO:-hello} является экземпляром [1] .

Примечание:

  • В Bash, переменные среды и собственные переменные оболочки Bash совместно используют одно и то же пространство имен, а переменные среды автоматически отображаются как переменные оболочки.

  • В PowerShell только собственные переменные PowerShell На можно ссылаться напрямую - например, $myVar - тогда как ссылка на переменные среды требует явного использования пространства имен env: - например, $env:PATH

Решения, приведенные ниже, сосредоточены главным образом на собственных переменных PowerShell, но методы могут аналогичным образом применяться к переменным среды.
Обратите внимание, что, хотя переменные среды всегда строки , переменные PowerShell могут быть любой (.NET)введите .


Чтобы эмулировать HELLO=${HELLO:-hello} в PowerShell, используйте:

# To target an *environment* variable, use $env:HELLO instead.
$HELLO = if ("$HELLO") { $HELLO } else { 'hello' }

Обратите внимание на "..." вокруг $HELLO в условном выражении, которое гарантирует, чтозначение преобразуется в строку перед приведением его к Boolean [2] : таким образом, оба случая $HELLO не былиопределяется (или явно содержит $null) и переменная , содержащая пустую строку , оценивается как $False, что соответствует поведению Баша.

Без строкового определения с "...",нестроковые значения, такие как 0 или $False, также вызовут ветвь else.
Однако, если вы когда-либо ожидаете, что $HELLO будет содержать string , если оно есть,Вы можете опустить "...".

Аналогично, вышеприведенное также работает с переменными среды , но, поскольку они всегда являются строками , вам не нужно строговключая "..." в этом случае:

$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 как таковое , просто потому что это не очень хорошая синтаксическая подгонка для языка, предоставляя краткие, PowerShell-идиоматические аналоги Bash ${HELLO-hello} и ${HELLO=hello} , обсуждаемые , как $HELLO ?? 'hello' и $HELLO ?= 'hello'- см. этот выпуск GitHub .

[2] PowerShell coeвозвращает любую строку в логическое значение с этим простым правилом: если строка пуста , она оценивается как $False;если он не пустой - независимо от его содержимого - он оценивается как $True.

0 голосов
/ 01 октября 2018

Самый простой способ:

$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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...