Почему мой скрипт Bash возвращает синтаксическую ошибку?

Я пишу скрипт, который зацикливается на последние файлы в папке и выполняет команду …

#!/bin/bash cd /home/Downloads recent_files = ($(ls -t | head -20)) for file in "${recent_files[@]}" do ./cmd $file done 

Я получаю следующую синтаксическую ошибку:

 line 3: syntax error near unexpected token `(' line 3: `recent_files = ($(\ls -t | head -20))' 

5 Solutions collect form web for “Почему мой скрипт Bash возвращает синтаксическую ошибку?”

Схема назначения переменных Bash – это var=value т.е. дополнительные пробелы не допускаются.

Удаление их правильно назначит ls -t | head -20 ls -t | head -20 output в виде массива.

Таким образом, ваш скрипт должен быть:

 #!/bin/bash cd /home/Downloads recent_files=($(ls -t | head -20)) for file in "${recent_files[@]}" do ./cmd $file done 

Вам вообще не нужно хранить вывод в переменной:

 cd /home/Downloads command ls -t | head -20 | while read -r file; do ./cmd "$file" done 

или даже

 command ls -t | head -20 | xargs -L 1 ./cmd 

Более безопасный способ работать с stat . Он по-прежнему не защищает вас от имен файлов с помощью новых строк, но

 stat -c "%Y %n" * | sort -rn | head -20 | cut -d" " -f2- | xargs -L 1 ./cmd 

Чтобы быть надежным, find – возможно, нужны инструменты GNU для обработки нулевого байта

 find . "${find_options[@]}" -printf '%T@ %p\0' | sort -zrn | xargs -0 -L 1 sh -c './cmd "$(echo "$0" | sed "1s/^[0-9.]\\+ //")"' 

массив find_options может использоваться в качестве заполнителя для добавления директив фильтрации, таких как

 find_options=( -type f ) find_options+=( -maxdepth 1 ) find_options+=( -name '*.txt' ) 

и так далее

Вы должны удалить пробелы вокруг знака равенства.

 recent_files=($(ls -t | head -20)) 

Тогда это должно сработать.

Я думаю, что есть более простой ответ …

 #! / Bin / Баш
 cd / home / Загрузки
 для файла в $ (ls -t | head -20)
 делать
     ./cmd $ file
 сделанный

В сообщении об ошибке говорится все. Однако, как помощь в решении таких проблем в будущем, вы можете принять некоторые практики:

  1. Прокомментируйте строку, которая вызывает ошибку:
  recent_files = ($ (ls -t | head -20)) 

и запустить

  bash -n myScript.sh 

Это проверит ошибки в скрипте.

  1. Комментируйте блок строк следующим образом:

     : << 'EOF' lines of code EOF 

и запустить

  bash -n myScript.sh 

Используя эту методологию, вы сможете приблизить ошибочную строку в своем скрипте.

Возвращаясь к вашей конкретной проблеме, многие уже ответили, что ее вызывает – пробелы вокруг знака = .

  • bash: Является ли продолжительность между двумя временными метками более одного часа?
  • скажите, была ли последняя команда пуста в PROMPT_COMMAND
  • Нет цветного вывода с параметром --login в bash
  • Как использовать две переменные в одном цикле
  • Избегайте того, что Ctrl-C отключает печать ввода
  • Как сделать строку «1.9.2» Ruby для окончательной версии с RVM?
  • вычесть строку из файла во все строки из другого файла
  • Как печатать без форматирования в bash?
  • Запустить скрипт bash из curl не удалось, пока из файла не удалось
  • генерировать пароль, который является случайной длиной между 8 - 16 (у меня есть генератор, но его не динамический)
  • bash: / usr / bin / perl: слишком длинный список аргументов
  • Interesting Posts

    Не удается добавить ubuntu в suse grub

    AWK & Bash: проверка того, что пользовательский дом принадлежит пользователю

    Почему rc.local не работает полностью

    Повторные значения для errno в man-странице

    «Нет доступных пакетов вина» и «Нет доступных пакетов флюкса»

    Как привязать Mount / var / tmp к / tmp, используя стандарты Ansible и CIS

    Что произойдет, если человек попытается войти в систему с той же учетной записью пользователя, что и тот, кто уже вошел в систему?

    Сервер X запускается только с правами root

    Шифровать вывод apt-listchanges перед отправкой электронной почты

    Установите приложение для SUSE Enterprise 11 на openSUSE 11.4

    Как вы пишете grub.cfg menuentry для Debian Netinst (8.2 от написания) для загрузки через USB?

    Как написать скрипт bash, который позволит пользователям выбирать значение переменной окружения MIRROR?

    Запрограммировать файл для самоуничтожения в заданное время

    Календарная программа Unix, обновленная для работы с несколькими годами?

    Использование переназначенной клавиши Left Control <LCTL> в качестве ярлыка

    Linux и Unix - лучшая ОС в мире.