Сообщение об ошибке Shell script

Я пытаюсь изучить сценарии оболочки, читая linuxcommand.org . По какой-то причине я продолжаю получать сообщение об ошибке «Not Found», хотя он выполняет все команды.

Коды ошибок, которые я получаю:

minecraft_backup.sh: 21: run_backup: not found minecraft_backup.sh: 23: function: not found 

Вот сценарий:

 #!/bin/bash #MineCraft backup script by #Variables APP=MineCraft SERVICE=Minecraft_Mod.jar APPDIR=/opt/MineCraft_Server/bin BACKUPDIR1=/opt/MineCraft_Server/backup1 BACKUPDIR2=/opt/MineCraft_Server/backup2 #First i want to check if minecraft server is running. if(ps ax | grep -v grep | grep $SERVICE > /dev/null) then echo "$APP is running" $(run_backup) else echo "$APP is not running" exit 1 fi function run_backup { echo "Starting back up" #create backup dirs of they do not exit if [ ! -d "$BACKUPDIR1" ] then mkdir $BACKUPDIR1 fi if [ ! -d "$BACKUPDIR2" ] then mkdir $BACKUPDIR2 echo "test" fi #backup save1 to save2 rsync -av --delete "$BACKUPDIR1/" "$BACKUPDIR2" #backup running app to save 1 rsync -av --delete "$APPDIR/" "$BACKUPDIR1" } 

4 Solutions collect form web for “Сообщение об ошибке Shell script”

Стандартной конструкцией для определения функции является

 run_backup () { … } 

В ksh, bash и zsh, но не в других оболочках, таких как тире, вы можете определить функцию с

 function run_backup { … } 

Что случилось, когда вы запускали скрипт с тире:

  • Оболочка выполнила $(run_backup) , естественно, в результате появилось первое сообщение об ошибке, так как не было команды под названием run_backup .
  • Позднее оболочка выполнила function run_backup , естественно, привело к появлению второго сообщения об ошибке, так как не было никакой команды, называемой function .
  • Затем оболочка выполнила скопированный блок, который сам по себе является допустимым синтаксисом оболочки.

Обратите внимание, что, как указывает комментарий xenoterracide, поскольку у вас есть #!/bin/bash , скрипт был бы запущен bash если вы не сделали что-то неправильно.

Даже если вы запустите скрипт с правильной оболочкой или (моя рекомендация), измените function на стандартный синтаксис (я не вижу никакой другой нестандартной конструкции), вам все равно нужно переместить определение функции до ее использования.

Еще один полезный совет: когда вы отлаживаете скрипт оболочки, запустите bash -x /path/to/script (или sh -x /path/to/script и т. Д.). Это выводит трассировку каждой выполненной строки. Если вы хотите проследить только часть скрипта, вы можете использовать set -x для включения трассировки и set +x для их отключения. Zsh имеет лучшие следы, чем другие, но имеет несовместимый синтаксис; вы можете сказать zsh, чтобы ожидать синтаксиса sh с помощью команды emulate sh 2>/dev/null (которая не действует в других оболочках).

Перед использованием вы должны определить свои функции.

Думаю, я решил это сам. Похоже, мне принадлежит тот факт, что Ubuntu использует dash по умолчанию, и я запускал скрипт с помощью команды sh … «вздох»,

Я собираюсь сделать некоторые догадки … vim не нравится, if( так что попробуйте, if ( это может быть просто vim.

Я думаю, что ваша настоящая проблема заключается в том, что вы вызываете run_backup прежде чем вы его создали. поставьте свою function до того, как вы будете блокировать if then else . оболочка должна знать о функциях, прежде чем они смогут их использовать. это относится к программированию в целом.

  • Переносная загрузочная установка Ubuntu, синхронизированная с моим основным компьютером
  • Больше места на диске, ничего не есть на моем диске. Зачем?
  • Создание доступного планшета Linux
  • Обновление дистрибутива на основе Ubuntu без потери всего
  • Не просыпаться после приостановки
  • Как включить арабскую клавиатуру в Peppermint OS 7?
  • Как звуковая проблема Linux может повлиять на Windows в конфигурации с двойной загрузкой?
  • Не удалось создать для Ubuntu
  • Как поделиться экраном между Centos 7 и Ubuntu 14?
  • невозможно отключить, разрешено отклонение
  • Получение статистики TCP IPv6
  • Linux и Unix - лучшая ОС в мире.