为了账号安全,请及时绑定邮箱和手机立即绑定

在bash中将数组作为参数传递

在bash中将数组作为参数传递

ITMISS 2019-07-25 19:41:18
在bash中将数组作为参数传递如何将数组作为参数传递给bash函数?注意:在Stack Overflow上没有找到答案后,我自己发布了一些粗略的解决方案。它只允许传递一个数组,它是参数列表的最后一个元素。实际上,它根本没有传递数组,而是传递了它的元素列表,这些元素通过called_function()重新组合成一个数组,但它对我有用。如果有人知道更好的方式,请随时在此处添加。
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您可以使用以下内容将多个数组作为参数传递:

takes_ary_as_arg(){
    declare -a argAry1=("${!1}")
    echo "${argAry1[@]}"

    declare -a argAry2=("${!2}")
    echo "${argAry2[@]}"}try_with_local_arys(){
    # array variables could have local scope
    local descTable=(
        "sli4-iread"
        "sli4-iwrite"
        "sli3-iread"
        "sli3-iwrite"
    )
    local optsTable=(
        "--msix  --iread"
        "--msix  --iwrite"
        "--msi   --iread"
        "--msi   --iwrite"
    )
    takes_ary_as_arg descTable[@] optsTable[@]}try_with_local_arys

将回应:

sli4-iread sli4-iwrite sli3-iread sli3-iwrite  
--msix  --iread --msix  --iwrite --msi   --iread --msi   --iwrite


查看完整回答
反对 回复 2019-07-25
?
MYYA

TA贡献1868条经验 获得超4个赞

注意:在我没有在Stack Overflow上找到答案之后,这是我自己发布的一些粗略的解决方案。它只允许传递一个数组,它是参数列表的最后一个元素。实际上,它根本没有传递数组,而是传递了它的元素列表,这些元素通过called_function()重新组合成一个数组,但它对我有用。稍后Ken发布了他的解决方案,但我在这里保留了他的“历史性”参考。

calling_function(){
    variable="a"
    array=( "x", "y", "z" )
    called_function "${variable}" "${array[@]}"}called_function(){
    local_variable="${1}"
    shift
    local_array=("${@}")}

由TheBonsai改进,谢谢。


查看完整回答
反对 回复 2019-07-25
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

这个怎么运作

函数中的takes_ary_as_arg descTable[@] optsTable[@]try_with_local_arys()发送:

  1. 这实际上是创建了函数可访问的descTableoptsTable数组的副本takes_ary_as_arg

  2. takes_ary_as_arg()函数接收descTable[@]optsTable[@]作为字符串,这意味着$1 == descTable[@]$2 == optsTable[@]

  3. takes_ary_as_arg()函数的开头,它使用${!parameter}语法,称为间接引用或有时双引用,这意味着我们使用扩展的值而不是使用值$1$1,例如:

    baba=booba
    variable=baba
    echo ${variable} # babaecho ${!variable} # booba

    同样的$2

  4. 把它放在一个数组(后面的括号)argAry1=("${!1}")创建扩展,就像直接写在那里。在那里不是必需的。argAry1=descTable[@]argAry1=("${descTable[@]}")declare

NB:值得一提的使用该托架形式的数组初始化初始化根据新阵列IFS内部字段分隔符,其是通过默认标签换行空间。在这种情况下,因为它使用了[@]符号,所以每个元素本身都被看作是被引用(与之相反[*])。

我的预订

BASH,局部变量范围是当前函数和从它调用的每个子函数,这转换为takes_ary_as_arg()函数“看到”那些descTable[@]optsTable[@]数组的事实,因此它正在工作(参见上面的解释)。

既然如此,为什么不直接看看那些变量呢?这就像写在那里:

argAry1=("${descTable[@]}")

参见上面的解释,它只是descTable[@]根据当前的值复制数组的值IFS

综上所述

从本质上讲,这通过没有任何价值 - 像往常一样。

我还要强调丹尼斯威廉姆森上面的评论:稀疏数组(没有所有键定义的数组 - 其中带有“孔”)将无法按预期工作 - 我们将松开键并“压缩”数组。

话虽这么说,我确实看到了泛化的价值,因此函数可以在不知道名称的情况下得到数组(或副本):

  • 对于〜“副本”:这种技术已经足够好了,只需要意识到索引(键)已经消失了。

  • 对于真实副本:我们可以使用eval作为密钥,例如:

    eval local keys=(\${!$1})

然后使用它们创建一个副本。注意:这里!没有使用它以前的间接/双重评估,而是在数组上下文中它返回数组索引(键)。

  • 当然,如果我们要传递descTableoptsTable字符串(没有[@]),我们可以使用数组本身(如引用中所示)eval。对于接受数组的泛型函数。


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 933 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信