Bash

Shell 腳本錯誤資訊

  • January 28, 2012

我正在嘗試通過閱讀linuxcommand.org來學習 shell 腳本。出於某種原因,我不斷收到錯誤“未找到”,即使它執行了所有命令。

我得到的錯誤程式碼是:

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"

}

定義函式的標準結構是

run_backup () { … }

在 ksh、bash 和 zsh 中,但在 dash 等其他 shell 中,您可以定義一個函式

function run_backup { … }

當您使用 dash 執行腳本時發生的情況是:

  • shell 執行了該$(run_backup)行,自然會導致第一條錯誤消息,因為沒有呼叫命令run_backup
  • shell 稍後執行function run_backup,自然導致第二條錯誤消息,因為沒有呼叫命令function
  • 然後 shell 執行了括號塊,這本身就是有效的 shell 語法。

請注意,正如 xenoterracide 的評論所表明的那樣,既然你有,如果你沒有做錯什麼#!/bin/bash,腳本就會被執行。bash

即使您使用正確的 shell 執行腳本,或者(我的建議)更改function為標準語法(我沒有看到任何其他非標準構造),您仍然需要將函式定義移至使用之前。

另一個有用的提示:當你調試一個 shell 腳本時,執行bash -x /path/to/script(或sh -x /path/to/script,等等)。這將列印每個執行行的跟踪。如果您只想跟踪腳本的一部分,您可以使用**set -x**啟用和set +x禁用跟踪。Zsh 比其他的有更好的跟踪,但它的語法不兼容;您可以使用命令告訴 zsh 期待 sh 語法emulate sh 2>/dev/null(這在其他 shell 中無效)。

引用自:https://unix.stackexchange.com/questions/5573