Вы можете сделать это, используя Список ключей массива . Со bash
страницы руководства :
${!name[@]}
${!name[*]}
Список ключей массива . Если имя является переменной массива, расширяется до списка индексов (ключей) массива, назначенных в имени. Если имя не является массивом, расширяется до, 0
если имя установлено, и ноль в противном случае. Когда @
используется и расширение отображается в двойных кавычках, каждый ключ раскрывается в отдельное слово.
Для вашего примера:
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in "${!AR[@]}"; do
printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done
Это приводит к:
${AR[0]}=foo
${AR[1]}=bar
${AR[2]}=baz
${AR[3]}=bat
Обратите внимание, что это также работает для непоследовательных индексов:
#!/bin/bash
AR=([3]='foo' [5]='bar' [25]='baz' [7]='bat')
for i in "${!AR[@]}"; do
printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done
Это приводит к:
${AR[3]}=foo
${AR[5]}=bar
${AR[7]}=bat
${AR[25]}=baz
"${array[*]}"
вместо"${array[@]}"
. Использование*
вместо@
более или менее обрабатывает его как строку вместо массива.