Shell 脚本错误信息

ev0*_*00l 3 shell bash ubuntu dash shell-script

我正在尝试通过阅读linuxcommand.org来学习 shell 脚本。出于某种原因,我不断收到错误“未找到”,即使它运行了所有命令。

我得到的错误代码是:

minecraft_backup.sh: 21: run_backup: not found

minecraft_backup.sh: 23: function: not found
Run Code Online (Sandbox Code Playgroud)

这是脚本:

#!/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 Code Online (Sandbox Code Playgroud)

Gil*_*il' 7

定义函数的标准构造是

run_backup () { … }
Run Code Online (Sandbox Code Playgroud)

在 ksh、bash 和 zsh 中,但不是在其他 shell 中(例如 dash),您可以使用以下命令定义函数

function run_backup { … }
Run Code Online (Sandbox Code Playgroud)

使用破折号运行脚本时发生的情况是:

  • shell 执行了该$(run_backup)行,自然会导致第一条错误消息,因为没有调用run_backup.
  • shell 后来执行了function run_backup,自然会导致第二条错误消息,因为没有调用命令function
  • 然后 shell 执行了支撑块,它本身就是有效的 shell 语法。

请注意,正如 xenoterracide 的评论所表明的那样,由于您有#!/bin/bashbash如果您没有做错任何事情,脚本就会被运行。

即使您使用正确的 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 中无效)。