0

我已经编辑了我的脚本,并且没有再出现错误,但是,该脚本没有在 Minecraft 服务器上执行,因此根本没有任何公告尝试。我很困惑。就好像它根本没有运行,就像服务器没有运行一样,但它是,并且应该匹配状态命令中的“正在运行”。

代码是:

#!/bin/bash

checkServer=$(/etc/init.d/minecraft status);
cd /.smc;

# Is the server even running?
if [ checkServer = *"is running"* ];
then

    # No count file? Create it.
    if [ ! -f /.smc/lastAnnouncement.txt ];
    then
            echo 0 < /.smc/lastAnnouncement.txt;
    fi

    # Load count
    lastAnn=$(cat /.smc/lastAnnouncement.txt);

    # ANNOUNCEMENTS
    announcement[0]='Dont  forget to check out http://fb.com/pyrexiacraftfans for news and updates';
    announcement[1]='Use our Facebook page to request land protection! Visit http://fb.com/pyrexiacraftfans';

    # Should we restart announcement que?
    if lastAnn == ${#announcement[@]}+1;
    then
            echo 0 < /.smc/lastAnnouncement.txt;
    fi

    # Send announcement
    sendAnnouncement=$(/etc/init.d/minecraft command say announcement[lastAnn]);

    # Next announcement count
    lastAnn=$((lastAnn+1));

    # Write next announacment count
    echo lastAnn < /.smc/lastAnnouncement.txt;

fi
4

4 回答 4

0

您的脚本存在多个问题,从无用的分号到错误的逻辑。问题列表是如此之长,以至于发布更正的脚本比指出问题更容易(其他答案甚至没有接近列出所有错误)。

更正后的脚本是:

#!/bin/bash

checkServer=$(/etc/init.d/minecraft status)
cd /.smc

# Is the server even running?
if [[ $checkServer =~ "is running" ]]; then
    # No count file? Create it.
    if [ ! -f /.smc/lastAnnouncement.txt ]; then
            echo 0 > /.smc/lastAnnouncement.txt
    fi

    # Load count
    lastAnn=$(cat /.smc/lastAnnouncement.txt)

    # ANNOUNCEMENTS
    announcement[0]='Dont  forget to check out http://fb.com/pyrexiacraftfans for news and updates'
    announcement[1]='Use our Facebook page to request land protection! Visit http://fb.com/pyrexiacraftfans'

    # Send announcement
    sendAnnouncement=$(/etc/init.d/minecraft command say ${announcement[$lastAnn]})

    # Next announcement count
    ((++lastAnn))

    # Write next announacment count
    # Should we restart announcement que?
    if [[ $lastAnn -gt ${#announcement[@]} ]]; then
            echo 0 > /.smc/lastAnnouncement.txt
    else
            echo $lastAnn > /.smc/lastAnnouncement.txt
    fi
fi

您的脚本的问题(撇开多余的不会造成伤害的分号,只是不必要的磁盘空间浪费):

  • $变量名前 缺失
  • 字符串比较不正确。使用=~而不是==[[而不是[,并*从字符串的两侧删除*"is running"*

    if [ checkServer == *"is running"* ]
    
  • 错误的重定向。你想写入文件,所以>,不是<. 这是多次。

    echo 0 < /.smc/lastAnnouncement.txt;
    echo 0 < /.smc/lastAnnouncement.txt;
    
  • 变量名丢失$和错误重定向

    echo lastAnn < /.smc/lastAnnouncement.txt;
    
  • 更容易增加((++lastAnn))。这也是无效的外壳,因为算术需要expr命令或((...))内置

    lastAnn=$lastAnn+1;
    
  • 变量名中缺少$。缺少test[[[。缺少expr$((..))添加1. -eq应该使用而不是==用于数字相等。从逻辑上讲,这应该用于-gt针对最后一个索引进行测试,并且+1不是必需的。

    if lastAnn == ${#announcement[@]}+1;
    

我不会讨论编写消息队列索引的逻辑不正确的事实,并且永远不会循环回到0.

但是,您在尝试编写脚本方面做得非常出色。许多人甚至不尝试。

编辑:我错过了{}上面脚本第 21 行的数组变量用法。固定的。

于 2013-06-06T20:53:03.873 回答
0

尝试:

if [ checkServer = *"is running"* ];

(是单等号)

于 2013-06-06T19:14:38.513 回答
0

我相信你的脚本有很多语法错误。

即这一行有问题:

sendAnnouncement = $(/etc/init.d/minecraft command say $announcement[$lastAnn]);

用这个替换它:

sendAnnouncement=$(/etc/init.d/minecraft command say $announcement[$lastAnn])

bash(和其他 shell)不允许在赋值运算符前后有空格=

还有这一行:

lastAnn=$lastAnn+1;

应替换为:

lastAnn=$((lastAnn+1))
于 2013-06-06T19:21:34.020 回答
0

有很多错误:

第一的,

if [[ $checkserver == *"is running"* ]]

使用双 [[...]] 和变量引用是 $checkserver。然后,

sendAnnouncement=$(

没有空间。

还,

if [ $lastAnn == $((${#announcement[@]}+1)) ]

应该更...

于 2013-06-06T19:23:24.333 回答