Судя по ошибке, ваш скрипт запускается с POSIX sh
, а не bash
. Массивы не определены в POSIX sh
.
Чтобы исправить это, добавьте правильный хэш-бэнг в ваш скрипт (например, /usr/bin/env bash
) или запустите скрипт напрямую с помощью интерпретатора Bash (например, /bin/bash script.sh
).
Кроме того (не связанный с рассматриваемой проблемой) ваш сценарий (или опубликованный фрагмент) имеет несколько потенциальных проблем:
переменные должны быть заключены в кавычки, чтобы предотвратить глобализацию и разбиение слов (например, рассмотрим d
- один из ваших файлов - содержащий *
- echo $d
будет включать список всех файлов, так как *
будет быть расширен)
разбиение на массив с ($var)
выполняется для любого символа IFS
, а не только для перевода строки. IFS
по умолчанию включает пробел, символ табуляции и новую строку. Рекомендуется использовать read -a
или mapfile
вместо ($var)
.
Наконец, если все, что вы пытаетесь получить, это получить последний компонент в пути (имя файла), вам следует рассмотреть возможность использования basename(1)
:
$ basename /path/to/file
file
или удаление подстроки синтаксис расширения параметра Bash:
$ path=/path/to/file
$ echo "${path##*/}"
file