Зацикливание по массивам, печать как индекса, так и значения

Я хочу сделать что-то вроде этого:

foo=( )
foo[0]="bar"
foo[35]="baz"
for((i=0;i<${#foo[@]};i++))
do
    echo "$i: ${foo[$i]}"
done
# Output:
# 0: bar
# 1: 

Затем я попытался пропустить его, используя для:

foo=( )
foo[0]="bar"
foo[35]="baz"
for i in ${foo[@]}
do
    echo "?: $i"
done
# Output:
# ?: bar
# ?: naz

но здесь я не знаю значения индекса.

Я знаю, что вы могли бы что-то вроде

foo=( )
foo[0]="bar"
foo[35]="baz"
declare -p foo
# Output:
# declare -a foo='([0]="bar" [35]="baz")'

но не можете ли вы сделать это по-другому?

Ответ 1

Вы найдете ключи массива с "${!foo[@]}" (ссылка), поэтому:

for i in "${!foo[@]}"; do 
  printf "%s\t%s\n" "$i" "${foo[$i]}"
done

Ответ 2

вы всегда можете использовать параметр итерации:

        ITER=0
        for I in ${FOO[@]}
        do  
            echo ${I} ${ITER}
            ITER=$(expr $ITER + 1)
        done

Ответ 3

INDEX=0
for i in $list; do 
    echo ${INDEX}_$i
    let INDEX=${INDEX}+1
done