linux - bash中间接引用数组的访问范围

标签 linux arrays bash reference queue

我有一个 bash 脚本需要构建一些集合,每个集合包含来自多个队列的 1 个元素(我正在考虑使用数组来存储这些) 例如,如果我有以下队列:

array1=(a b c e f)                                                            
array2=(x y z)                                                                
array3=(1 2 3 4)

我需要获取以下数组(不一定一次全部获取,我一次处理一个结果数组)

a x 1
b y 2
c z 3
e 4
f

The number of arrays is dynamic.

So basically i need to pop the first element from each array and put in another array. I know i can pop the first element from an array like this:

 el1=${array1[0]}
 array1=(${array1[@]:1:$((${#array1[@]}))})

此外,我知道我可以像这样从间接引用的数组中提取一个值:

val=$(eval echo \${$arr[0]})

我的问题是:如何重写从数组中弹出第一个元素的部分以使用间接引用。

完整的测试脚本如下:

#!/bin/bash

set -e 
set -u


array1=(a b c e f)
array2=(x y z)
array3=(1 2 3 4)

finished=false
while ! $finished; do
   finished=true

   array4=()
   for arr in array1 array2 array3; do
      val=$(eval echo \${$arr[0]})
      if [ ! -z $val ]; then
         array4=(${array4[@]} $val)
         $arr=(\${$arr[@]:1:$((\${#$arr[@]}))})
      fi
   done

   l4=${#array4[@]}
   if [ $l4 -gt 0 ]; then
      finished=false

      for i in ${array4[@]}; do
         echo $i
      done
   fi

done

最佳答案

array1=(a b c e f )                                                            
array2=(x y z)                                                                
array3=(1 2 3 4)

cnt=0
while : ; do
  line=''
  for a in ${!array*}; do               # loop over names "array*"
    val=$(eval echo \${$a[$cnt]} )
    line="$line ${val:- }"              # build line
  done
  ((cnt++))
  [[ $line =~ ^\ +$ ]] && break         # break if line has only blanks
  echo -e "${line:1}"
done

输出:

a x 1
b y 2
c z 3
e   4
f      

关于linux - bash中间接引用数组的访问范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10102140/

相关文章:

php - 执行CGI Python脚本后,如何自动返回首页?

linux - Bash 反向 shell 命令 cron 作业不起作用 - 我放弃了

linux - 如何查看 Git cmd 使用的是哪个 gpg homedir 版本和 `homedir`?

c++ - 如何使用cin读取字符数据存入数组并显示?

bash - 将文件夹中的文件重命名为连续编号

ruby-on-rails - Ruby Passenger 显示来自公众而不是应用程序的内容

php - 转义数组中的变量并将转义值动态分配给原始变量值

c# - 检查数组是否为空且有内容

bash:rsync 选项作为变量

bash - URL 替换为 sed