![shell脚本错误信息](https://linux22.com/image/593/shell%E8%84%9A%E6%9C%AC%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF.png)
我正在尝试通过阅读来学习 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 必须先了解函数才能使用它们。一般的编程都是如此。