最近我已迁移到运行在相同操作系统上的新专用服务器 - 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编码,所以我不知道为什么会发生这种情况......
答案 0 :(得分:2)
Bourne shell(sh
)不支持数组,这就是您在使用
sh script.sh
使用bash
代替
bash script.sh
注意:我怀疑sh script.sh
在旧服务器上工作,因为sh
与bash
相关联。
答案 1 :(得分:1)
你也不需要通过sh
来运行它(这就是
#!
在第一行是 - 操作系统将作为命令运行该行的其余部分并传递文件的内容以供其解释)。只需使脚本可执行:
chmod +x script.sh
然后你可以直接运行它而不需要名字前面的sh
。
默认shell可能不是bash,因此通过sh
运行它你用不同的shell解释它然后给出错误
答案 2 :(得分: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
答案 3 :(得分:0)
尝试使用饰面和尾随空格
PORTS=( 7777:GAME 11000:AUTH 12000:DB )