2

最近我已经迁移到运行在同一操作系统上的新的专用服务器 - FreeBSD 8.2。我获得了 root 帐户访问权限,并且所有权限都已正确设置。

我的问题是,我在旧服务器上运行的 bash 脚本在新机器上不起作用,运行脚本时出现的唯一错误是:

# sh script.sh
script.sh: 3: Syntax error: word unexpected (expecting ")")

这是代码本身:

#!/usr/local/bin/bash

PORTS=(7777:GAME 11000:AUTH 12000:DB)
MESSG=""
for i in ${PORTS[@]} ; do
    PORT=${i%%:*}
    DESC=${i##*:}
    CHECK=`sockstat -4 -l | grep :$PORT | awk '{print $3}' | head -1`
    if [ "$CHECK" -gt 1 ]; then
        echo $DESC[$PORT] "is up ..." $CHECK
    else
        MESSG=$MESSG"$DESC[$PORT] wylaczony...\n"
        if [ "$DESC" == "AUTH" ]; then
            MESSG=$MESSG"AUTH is down...\n"
        fi
        if [ "$DESC" == "GAME" ]; then
            MESSG=$MESSG"GAME is down...\n"
        fi
        if [ "$DESC" == "DB" ]; then
            MESSG=$MESSG"DB is down...\n"
        fi

    fi
done

if [ -n "$MESSG" ]; then
    echo -e "Some problems ocurred:\n\n"$MESSG | mail -s "Problems" yet@another.com
fi

我并没有真正用 bash 编写代码,所以我不知道为什么会发生这种情况......

4

4 回答 4

2

Bourne shell ( sh) 不支持数组,这就是您在使用时遇到此错误的原因

sh script.sh

bash改为使用

bash script.sh

注意:我怀疑它sh script.sh在旧服务器上工作,因为sh它链接到bash那里。

于 2012-10-20T23:13:48.303 回答
1

您也不需要运行它sh(这就是 #! 第一行的用途 - 操作系统将运行该行的其余部分作为命令并传递文件的内容以供其解释)。只需使脚本可执行: chmod +x script.sh 然后您可以直接运行它而无需sh名称前面。

默认 shell 可能不是 bash,因此通过运行它,sh您正在使用不同的 shell 解释它,然后给出错误

于 2012-10-20T17:17:35.550 回答
0

代码看起来不错。很可能您的新专用服务器运行的 Bash 版本比您上一个服务器的版本旧。或者 /usr/local/bin/bash 可能指向旧版本。

$ 哪个 bash

如果输出不是/usr/local/bin/bash那么将第一个 shebang 行更改为较新的路径,如果它仍然不起作用

尝试替换第三行:

PORTS=(7777:GAME 11000:AUTH 12000:DB)

PORTS=('7777:GAME' '11000:AUTH' '12000:DB')

并重新运行脚本。

如果它仍然不起作用,请通过运行在此处发布 BASH 版本

$ bash --version
于 2012-10-20T18:18:04.377 回答
0

尝试面对和尾随空格

PORTS=( 7777:GAME 11000:AUTH 12000:DB )
于 2012-10-20T18:23:30.207 回答