Arrays 与powershell中的local等效,测试数组中是否包含元素
我希望在PowerShell中使用与此代码等效的代码Arrays 与powershell中的local等效,测试数组中是否包含元素,arrays,bash,powershell,scope,contains,Arrays,Bash,Powershell,Scope,Contains,我希望在PowerShell中使用与此代码等效的代码 function containsElement () { local e for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done return 1 } 请帮助我您不需要在PowerShell中使用该功能,因为它附带了-contains和-in(它们的区别仅在于阵列是在LHS上还是在RHS上): 如上所述,将产生预期的True(输出表示形式为$True
function containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
请帮助我您不需要在PowerShell中使用该功能,因为它附带了
-contains
和-in
(它们的区别仅在于阵列是在LHS上还是在RHS上):
如上所述,将产生预期的True
(输出表示形式为$True
)
注意事项:与传统shell不同,PowerShell有一个基于.NET的富类型系统,这意味着(隐含的)相等比较可能并不总是如预期的那样工作;简而言之,由于自动类型转换,比较中的操作数顺序很重要,因此'0xa'-in 10,'other'
是$true
,但10-in'0xa','other'
不是-有关详细信息,请参阅的底部部分
如果确实需要使用作为单个参数传递的数组元素复制Bash函数: 还请注意,PowerShell将布尔值作为数据(隐式或显式
[bool]
值)进行通信,而不是通过不可见的状态信息(退出代码)进行通信,就像Bash之类的POSIX外壳一样-有关详细信息,请参阅的底部部分
PowerShell中的局部变量与POSIX类shell中的局部变量(例如Bash) 上述函数中的
$e
和$arr
都是局部变量,这是隐式的;如果您想明确说明这一事实,可以使用$local:e,$local:arr=$args
,但这从来都不是必需的,因为在PowerShell中隐式分配变量,并且总是在本地(当前)范围内创建它
这不同于类似POSIX的shell,其中赋值不带本地
修改父范围中预先存在的变量,或者如果没有,则隐式在顶级(脚本)范围中创建变量[1]:
- 与POSIX类shell一样,PowerShell中的子作用域(子作用域及其子作用域…)确实会看到局部变量
- 与POSIX类Shell不同(除了
[1]),PowerShell还提供了一种方法来创建真正的局部变量,即仅在定义范围内可见且可修改的变量,即通过ksh
范围修饰符:$private:
[2]。$private:var='truely local'
作用域为
的变量的有效行为与您在词典作用域的编译编程语言(如C#)中对局部变量的期望相同(与动态作用域的脚本语言相反)$private
- 与POSIX类Shell不同(除了
- 与类似POSIX的shell不同,后代作用域不能通过非限定赋值修改调用方的局部变量,或者任何祖先作用域的变量
- 但是,PowerShell提供了对祖先作用域的显式访问,即通过
和$script:
作用域说明符,以及通过$scope:
和Get Variable
cmdlet的Set Variable
参数-scope
- 但是,PowerShell提供了对祖先作用域的显式访问,即通过
[1]演示POSIX类Shell中的作用域 以下脚本在
bash
、dash
和zsh
中工作(bash
和dash
经常用作系统的默认shell,/bin/sh
)
要使脚本在ksh
中运行,必须用typeset
替换local
关键字,并用function
关键字定义函数(function a{…
而不是a(){…
),因为ksh
不理解local
,只使用函数
语法创建局部变量。然而,与前面提到的其他类似POSIX的shell不同,
ksh
然后创建一个真正的局部变量,这在后代作用域中是看不到的,就像PowerShell的$private:
作用域那样;换句话说:局部ksh
变量总是函数局部的,后代作用域永远看不到它们
#!/usr/bin/env bash
a() {
local var='1' # create local variable.
echo " calling scope before: [$var]"
b # call function b
echo " calling scope after: [$var]"
}
b() {
echo " child scope before: [$var]" # calling scope's var. is visible
var='1a' # modifies the *caller's* var.
local var=2
var='2a' # modifies the *local* var.
echo " child scope after: [$var]"
newvar='hi' # assigning to a variable that doesn't exist in any scope
# on the call stack creates it in the *top-level* scope.
}
# Call function a()
a
# var. created in b() without `local` is now visible.
echo "script scope: [$newvar]"
这将产生以下结果:
calling scope before: [1]
child scope before: [1]
child scope after: [2a]
calling scope after: [1a]
script scope: [hi]
[2]演示PowerShell中的$private:
作用域
# & { ... } executes ... in a child scope.
# Referencing a variable by itself implicitly outputs it (implicit `echo `).
PS> $var = 'outer'; & { $private:var = 'inner'; $var; & { $var } }
inner
outer
也就是说,私有的
$var
只在外部的{…}
中直接可见;嵌套的{…}
再次看到了祖辈作用域的$var您不需要在PowerShell中使用函数,因为它附带了
-contains
和-in
(它们的区别仅在于阵列是在LHS上还是在RHS上):
如上所述,将产生预期的True
(输出表示形式为$True
)
注意事项:与传统shell不同,PowerShell有一个基于.NET的富类型系统,这意味着(隐含的)相等比较可能并不总是按预期工作;简而言之,由于自动类型转换,比较中的操作数顺序很重要,因此'0xa'-in 10,“other'
是$true
,但10-in'0xa',other'
不是-有关详细信息,请参阅的底部部分
如果确实需要使用作为单个参数传递的数组元素复制Bash函数:
还请注意,PowerShell将布尔值作为数据(隐式或显式[bool]
值)进行通信,而不是通过不可见的状态信息(退出代码)进行通信,就像Bash之类的POSIX外壳一样-有关详细信息,请参阅的底部部分
PowerShell中的局部变量与POSIX类shell中的局部变量(例如Bash)
上述函数中的$e
和$arr
是局部变量,即
calling scope before: [1]
child scope before: [1]
child scope after: [2a]
calling scope after: [1a]
script scope: [hi]
# & { ... } executes ... in a child scope.
# Referencing a variable by itself implicitly outputs it (implicit `echo `).
PS> $var = 'outer'; & { $private:var = 'inner'; $var; & { $var } }
inner
outer