Bash - 如何将数组传递给函数,并在新函数中定义索引

Posted

技术标签:

【中文标题】Bash - 如何将数组传递给函数,并在新函数中定义索引【英文标题】:Bash - How to pass array to function, with index defined in new function 【发布时间】:2020-02-17 18:53:46 【问题描述】:

我有这个当前函数用于创建菜单样式的数组(关联数组不能在场景中使用)。

declare -a array1=("host1" "host2" "host3")
declare -a array2=("ip1" "ip2" "ip3")

function menusetup 

  iter=0
  for ((i=0; i<(count*2); i+=2)); do
    menu[$i]=$array1[$iter]
    menu[$i+1]=$array2[$iter]
    ((iter++))
  done


menusetup

这给了我带有"host1" "ip1" "host2" "ip2" "host3" "ip3" 的菜单数组 这非常适合我的需要,但现在我想重用这个函数来传递任何 2 个数组,就像这样。

function menusetup 

  iter=0
  for ((i=0; i<(count*2); i+=2)); do
    menu[$i]=$$1[$iter]
    menu[$i+1]=$$2[$iter]
    ((iter++))
  done


menusetup "$array3[@]" "$array4[@]"

编辑:我知道第二个示例传递了数组的整个元素列表。我想知道是否有办法传递和替换数组

【问题讨论】:

什么是count?它没有在您的代码中定义。顺便说一句,您可能正在寻找 namerefs ksh-ish function func 是正确的,可以在 bash 上工作,它不是由 posix 指定的。所以最好坚持使用 POSIX func() ,它可以在任何地方工作,请参阅 bash Obsolete and deprecated syntax。 $$1[$iter] 我想这是你的问题,对吧?如果是这样使用 bash nameref,但数组的语法很奇怪。 menu setup "$array3[@]" 不将数组作为参数传递;它传递数组的所有元素,每个元素都作为一个单独的参数。数组不是bash 中的一等值。 您正在传递一个包含两个数组元素的列表,但无法知道第一个结束和第二个开始的位置。如果它们的长度相同,则显然第二个开始于中途。 @oguzismail,抱歉认为不需要解决问题。计数是其中一个数组的长度(两者总是相同的长度) 【参考方案1】:

虽然您可以使用 bash 名称引用:

array3=(1 2 3)
array4=(a b c)
menusetup() 
   declare -g menu
   declare -n count1=$1[@]
   count=$(( $#count1 ))
   iter=0
   for ((i=0; i<count; i+=2)); do
       declare -n el1=$1[$iter]
       declare -n el2=$2[$iter]
       menu[$i]=$el1
       menu[$i+1]=$el2
       ((iter++))
    done


menusetup array3 array4
declare -p menu
# will output:
# declare -a menu=([0]="1" [1]="a" [2]="2" [3]="b" [4]="3" [5]="c")

这是一种有效且有用的编程风格,将 bash 视为管道会更好、更容易。您不需要状态,也不需要“迭代”数组。

将 bash 视为流。您在这里所做的是“压缩”两个数组。因此,首先在换行符分隔的项目上打印每个数组元素,然后使用paste 将两个换行符分隔的流连接在一起,将paste 分隔符指定为换行符。然后用readarray &lt; &lt;(...)IFS=$'\n' menu=( $(...) ) 将它读入一个数组。

假设数组值中没有换行符,你的函数所做的整个工作可以简单地完成:

readarray -t menu < <(paste -d$'\n' <(printf "%s\n" "$array3[@]") <(printf "%s\n" "$array4[@]") )

【讨论】:

老兄,真的非常感谢你!这正是我一直在寻找的。我是一个新手 java 编码器,所以不太熟悉 bash 的所有语法和功能。那个班轮真的让我很惊讶,但现在我会坚持使用这个功能,而我对 bash 感到更舒服

以上是关于Bash - 如何将数组传递给函数,并在新函数中定义索引的主要内容,如果未能解决你的问题,请参考以下文章

如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]

数组应该如何从 C# 传递给 Javascript 函数?

如何将函数作为道具传递给子组件并在Vue中从那里调用它?

如何将数组传递给函数?

如何将二维数组传递给函数[重复]

如何使用 React js 中的上下文将函数从 FUNCTIONAL 传递给 CLASS 组件并在渲染之外(没有 prop)访问它?