набранный-A дает ошибку в сценарии

Как slm уже указали, что можно протестировать на $f , чтобы быть регулярным файлом. При изучении я изменил бы сценарий, чтобы не быть одним лайнером, они имеют тенденцию быть более твердыми считать и поддержать:

for f in *
do 
  if [ -f "$f" ]
  then
    mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"
  fi 
done

(можно всегда свернуть это позже путем вставки ; и удаляющий новые строки)

-f тестирует аргумент, чтобы быть регулярным файлом (не устройство или каталог), существуют другие тесты также (-d для каталога, например, таким образом, вы могли протестировать если [!-d "$f"] также в этом случае).

0
14.08.2014, 01:22
1 ответ

Это ошибка, сгенерированная Bash 3 для типового набора -A -A. Ассоциативные массивы были добавлены в Bash 4, а не в Bash 3.2 и более ранних версиях.

Похоже, что ваш скрипт выполняется с другой версией Bash, чем та, которую вы используете в качестве оболочки. Если вы находитесь на одной машине в обоих случаях, то у вас установлено несколько версий и, вероятно, вы можете выбрать одну из них с другим путем. Если вы находитесь на другой машине, на которой запущен скрипт, вы можете установить более новую версию, но в противном случае вам не повезло с прямой поддержкой Bash.

zsh поддерживает ассоциативные массивы с гораздо более старых версий, так что если у вас есть такая возможность, вы, скорее всего, сможете портировать ваш скрипт без лишней работы. Если у вас нет такой возможности, вы можете подделать его с помощью обычных массивов и grep, или используя ${!prefix@} и набор обычных переменных, который доступен в более старых версиях Bash. ${!prefix@} распространяется на имена всех переменных, имена которых начинаются с префикса, который можно использовать в комбинации с несколькими переменными префикс_key1, префикс_another, чтобы получить большинство поведений ассоциативных массивов.

2
28.01.2020, 02:37

Теги

Похожие вопросы