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)
定义函数的标准构造是
run_backup () { … }
Run Code Online (Sandbox Code Playgroud)
在 ksh、bash 和 zsh 中,但不是在其他 shell 中(例如 dash),您可以使用以下命令定义函数
function run_backup { … }
Run Code Online (Sandbox Code Playgroud)
使用破折号运行脚本时发生的情况是:
$(run_backup)
行,自然会导致第一条错误消息,因为没有调用run_backup
.function run_backup
,自然会导致第二条错误消息,因为没有调用命令function
。请注意,正如 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 中无效)。