最近,我迁移到了在上运行的新专用服务器,相同的操作系统-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:nn"$MESSG | mail -s "Problems" yet@another.com
fi
我不是真正的bash代码,所以我不知道为什么会发生...
bourne shell( sh
)不支持数组,这就是为什么当您使用
sh script.sh
使用 bash
代替
bash script.sh
NOTE :我怀疑sh script.sh
在旧服务器上工作,因为sh
链接到那里的bash
。
也不需要通过 sh
运行它(这就是什么 #!
在第一行中是 - OS将以命令作为命令运行该行的其余部分,并传递文件的内容以解释)。只需使脚本可执行: chmod +x script.sh
然后,您只需在名称前面的sh
即可直接运行它。
默认外壳可能不是bash,因此通过sh
运行它,您可以用不同的外壳来解释它,然后给出错误
代码看起来不错。您的新专用服务器可能比上一台服务器运行较旧版本的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
尝试面对和尾巴
PORTS=( 7777:GAME 11000:AUTH 12000:DB )