Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 与powershell中的local等效,测试数组中是否包含元素_Arrays_Bash_Powershell_Scope_Contains - Fatal编程技术网

Arrays 与powershell中的local等效,测试数组中是否包含元素

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

我希望在PowerShell中使用与此代码等效的代码

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不同(除了
      ksh
      [1]),PowerShell还提供了一种方法来创建真正的局部变量,即仅在定义范围内可见且可修改的变量,即通过
      $private:
      范围
      修饰符:
      $private:var='truely local'
      [2]。
      作用域为
      $private
      的变量的有效行为与您在词典作用域的编译编程语言(如C#)中对局部变量的期望相同(与动态作用域的脚本语言相反)
  • 与类似POSIX的shell不同,后代作用域不能通过非限定赋值修改调用方的局部变量,或者任何祖先作用域的变量

    • 但是,PowerShell提供了对祖先作用域的显式访问,即通过
      $script:
      $scope:
      作用域说明符
      ,以及通过
      Get Variable
      Set Variable
      cmdlet的
      -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