没有脚本输出

时间:2013-06-06 19:07:50

标签: bash sh

我已编辑了我的脚本,并且没有更多错误,但是,脚本没有执行到Minecraft服务器,根本没有公告尝试。我感到困惑。好像它根本没有运行,就像服务器没有运行一样,但是它应该是匹配的"正在运行"来自status命令。

,代码是:

#!/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 个答案:

答案 0 :(得分:0)

尝试:

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

(是单等号)

答案 1 :(得分: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))

答案 2 :(得分:0)

有很多错误:

首先,

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

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

sendAnnouncement=$(

没有空间。

此外,

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

可能更多......

答案 3 :(得分: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))更容易增加。这也是无效的shell,因为算术需要expr命令或((...)) builtin

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

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

我不会认为编写消息队列索引的逻辑不正确,并且永远不会循环回0

但是,您尝试编写脚本时做得非常好。很多人甚至都没有尝试过。

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