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
.