1

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

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[@]}"

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

4

1 回答 1

0

虽然您可以使用 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[@]}") )
于 2019-10-21T16:58:48.767 回答