shell脚本错误信息

shell脚本错误信息

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

我得到的错误代码是:

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"

}

答案1

定义函数的标准结构是

run_backup () { … }

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

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 中没有效果)。

答案2

您的函数需要在使用之前定义。

答案3

我想我自己解决了。似乎我被 Ubuntu 作为默认使用的事实所拥有dash,并且我正在使用命令运行脚本sh......“叹息”

答案4

我要做一些猜测……vim不喜欢if(,所以尝试一下if (,但这可能只是一件很有趣的事情。

我认为你真正的问题是你run_backup在创建它之前调用。把你的放在function你的块之前if then else。 shell 必须先了解函数才能使用它们。一般的编程都是如此。

相关内容