Доступ к переменной индекса массива из цикла сценария оболочки bash?

Я хочу получить доступ к переменной индекса массива во время цикла через массив в моем сценарии оболочки bash.

myscript.sh

#!/bin/bash AR=('foo' 'bar' 'baz' 'bat') for i in ${AR[*]}; do echo $i done 

Результат приведенного выше сценария:

 foo bar baz bat 

В результате я ищу:

 0 1 2 3 

Как изменить свой сценарий для достижения этого?

2 Solutions collect form web for “Доступ к переменной индекса массива из цикла сценария оболочки bash?”

Вы можете сделать это, используя косвенное. Из bash страницы bash :

Если первым символом параметра является восклицательный знак (!), Он вводит уровень переменной косвенности. Bash использует значение переменной, сформированной из остальной части параметра, как имя переменной; эта переменная затем расширяется и это значение используется в остальной части подстановки, а не значение самого параметра. Это называется прямым расширением. Исключение составляют расширения $ {! Prefix *} и $ {! Name [@]}, описанные ниже. Исключительная точка должна немедленно следовать за левой скобкой, чтобы ввести косвенность.

Для вашего примера:

 #!/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 

Дополнительно к ответу Иордан можно также сделать C подобный цикл в bash :

 for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done 
  • Добавление ведущих символов перед строкой с использованием printf или echo
  • GDB не может выполнить мою тестовую программу
  • Что означает «//» взамен от `which`
  • Анализ паролей Apache для исключения диапазонов IP-адресов
  • Способ записи нового имени файла на подстановочный знак?
  • Сделать Trickle получить правильную $ PATH
  • Можно ли программно изменить рабочий каталог родительской оболочки?
  • Почему / etc / shadow сокращает пароль, который я установил с помощью команды: useradd -p?
  • Пара арифметических связанных команд, Dash, POSIX shell, sh, Increment
  • Настройка командной строки
  • Обновить имя процесса в оболочке, возможно ли это?
  • Linux и Unix - лучшая ОС в мире.