Bash는 특정 루프 순서를 존중하여 배열을 다른 배열의 입력과 결합합니다.

Bash는 특정 루프 순서를 존중하여 배열을 다른 배열의 입력과 결합합니다.

특정 시퀀스를 존중하여 다른 배열과 결합된 새 배열을 생성하려고 합니다. 순수한 Bash에서. 예:

numbers=(0 1 2 3 4 5 6 7 8);

colors=(red blue green);

loop_sequence=(numbers numbers colors numbers colors colors)

출력 예:

0 1 red 2 blue green 3 4 red 5 blue green 6 7 red 8 blue green 0 1 red 2 blue green...

그러나 반복적인 내부 루프를 만드는 것이 어렵다는 것을 알고 있습니다. 어떤 도움이라도 매우 환영합니다.

답변1

Bash에서는 동적 변수 이름이 까다롭지만 변수를 통해 간접적으로 이름을 지정할 수 있습니다.

numbers=(0 1 2 3 4 5 6 7 8)
colors=(red blue green)
loop_sequence=(numbers numbers colors numbers colors colors)

# keep track of where you are in each array
declare -A idx=([numbers]=0 [colors]=0)

for varname in "${loop_sequence[@]}"; do 
    tmp="${varname}[${idx[$varname]}]"   # construct the array reference
    echo "$varname => ${!tmp}"           # variable indirection gets the value
    (( idx[$varname]++ ))
done

산출

numbers => 0
numbers => 1
colors => red
numbers => 2
colors => blue
colors => green

loop_sequence를 무기한 반복하려면 다음을 수행할 수 있습니다.

declare -A idx=([numbers]=0 [colors]=0)
# store the array sizes for convenience
declare -A size=([numbers]=${#numbers[@]} [colors]=${#colors[@]})
while true; do 
    for varname in "${loop_sequence[@]}"; do 
        tmp="${varname}[${idx[$varname]}]"
        echo "$varname => ${!tmp}"
        # loop the array index
        (( idx[$varname] = (idx[$varname]+1) % size[$varname] ))
    done
done | less

답변2

x=$(( (l=${#loop_sequence[@]}) * (n=${#numbers[@]}) * (c=${#colors[@]})))
_n= _c= _l=
set --    
math(){ return "$(($1-=-($1<${1#?})|$1-1))"; }
while   [ "$((x-=1))" -ge 0 ]
do      math _l
        case "${loop_sequence[$?-1]}" in
        n*)  math _n
             set -- "$@" "${numbers[$?-1]}";;
        *)   math _c
             set -- "$@" "${colors[$?-1]}";;
        esac
done;   printf %s\\n  "$@"

0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green
0
1
red
2
blue
green
3
4
red
5
blue
green
6
7
red
8
blue
green

관련 정보