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 < <(...)
或IFS=$'\n' menu=( $(...) )
将它读入一个数组。
假设数组值中没有换行符,你的函数所做的整个工作可以简单地完成:
readarray -t menu < <(paste -d$'\n' <(printf "%s\n" "$array3[@]") <(printf "%s\n" "$array4[@]") )
【讨论】:
老兄,真的非常感谢你!这正是我一直在寻找的。我是一个新手 java 编码器,所以不太熟悉 bash 的所有语法和功能。那个班轮真的让我很惊讶,但现在我会坚持使用这个功能,而我对 bash 感到更舒服以上是关于Bash - 如何将数组传递给函数,并在新函数中定义索引的主要内容,如果未能解决你的问题,请参考以下文章
如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]
如何使用 React js 中的上下文将函数从 FUNCTIONAL 传递给 CLASS 组件并在渲染之外(没有 prop)访问它?