Несмотря на то, что вы можете использовать ссылки на имена 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 как о потоках. То, что вы делаете здесь, это то, что вы "zip" - два массива. Поэтому сначала напечатайте каждый элемент массива на элементах, разделенных символом новой строки, а затем используйте paste
для объединения двух потоков, разделенных символом новой строки, укажите разделитель paste
для символа новой строки. Затем прочитайте его в массив, либо с readarray < <(...)
или IFS=$'\n' menu=( $(...) )
.
Предполагая, что в значениях массива нет символов новой строки, всю работу, которую выполняет ваша функция, можно выполнить просто:
readarray -t menu < <(paste -d$'\n' <(printf "%s\n" "${array3[@]}") <(printf "%s\n" "${array4[@]}") )