Intereting Posts
Обновление CentOS командой YUM без удаления предыдущей версии Могу ли я получить «Permission denied» при нехватке места? Как отслеживать / исправлять проблему с памятью в большом коде C / C ++ на системах * nix jq возвращает полный результат после операции Как я могу получить / bin / login для таймаута Существуют ли awk-версии, которые обеспечивают синтаксис для вычисления агрегатов? Как получить пароль пользователя из теневого файла linux? Как использовать правила udev для управления / dev / xxx при работе в контейнере Как передать файл значений с разделителями в виде пробелов в виде ряда аргументов? Как установить зависимости предложений пакета Как просмотреть размер двоичных файлов с помощью команды linux? Использование sed для удаления разделителей цифр, заключенных в кавычки и кавычки из CSV? Проблема с появлением команд в Expect Script Можно ли обновить систему FreeBSD до последней версии (базовая система + пакеты), используя только двоичные файлы? Найти каталог, если количество файлов превышает X

Доступ к переменной индекса массива из цикла сценария оболочки 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 

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

Вы можете сделать это, используя косвенное. Из 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