我有一个 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/