当我尝试在 RedHat 操作系统中运行脚本时遇到问题。我收到算术语法错误。
现在这是我尝试运行的脚本:
#!/bin/ksh
echo ""
echo " = K+WA =";
WA_PORT="`cat /usr/kplushome/entities/Standalone/config/kondor.active |grep PORTAL_PORT|cut -d '&' -f 2`"
#== Checking Tomcat of WebAccess
printf "%25s" Tomcat
touch /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid
PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`
if [[ $PID = "" ]];then
echo " x 0"
else
PSPID=`/bin/ps -eo pid | grep -w $PID`
if [[ $PSPID -eq $PID ]];then
/bin/ps -ef | grep $PID | grep -v grep | awk 'NR==1 {print " = "$8 $9 $10 $11 $12 $13 $14 $15}'
else
echo " x 0"
fi
fi
PORT_STATUS=`netstat -an | grep ${WA_PORT} | grep LISTEN | perl -pe "s/^.+\n/LISTENING/g;"`
PORT_STATUS=${PORT_STATUS:="NOT LISTENING!!!"}
echo " Port ${WA_PORT}/TCP = ${PORT_STATUS}"
cd /usr/kplushome/entities/Standalone/config/webaccess/WebaccessServer/etc
(PATH=/usr/ucb:$PATH; ./checkall.sh;) | perl -pe "s,^, ,g;"
echo ""
问题是我没有看到第 15 行有任何问题,因为我没有看到任何来自 unix 的规则因算术语法错误而被违反,还是我遗漏了一些东西?请问各位专家有什么建议吗?任何帮助将非常感激。谢谢。
答案1
脚本的第 14 行和第 15 行是:
PSPID=`/bin/ps -eo pid | grep -w $PID`
if [[ $PSPID -eq $PID ]];then
如果您在第 15 行遇到错误,最可能的原因是PSPID
orPID
未定义,可能会导致第 15 行出现类似以下内容的有效结果:
if [[ -eq 12345 ]];then
这将是一个语法错误。您可以通过引用变量(例如"$PID"
而不是$PID
)来缓解这种情况。
顺便说一句,了解脚本运行时发生的情况很有帮助。它确实会稍微修改输出,但对于脚本中有问题的部分,请在行为不当的部分加上前缀set -x
,并且标准输出现在将包括逐个命令发送到运行脚本的 shell 的内容。
答案2
错误消息显示两个数字。这些似乎是进程 ID。一个可能的答案是你的路线
PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`
正在查找 2 个文件,并且您将在变量中设置这 2 个 pid,并以换行符分隔。当使用 in 时,if [[ $PSPID -eq $PID ]]
后面会出现 2 个数字-eq
,这是语法错误。
您应该用双引号引用您的变量(例如"$PID"
)以避免这种类型的语法错误,但显然真正的问题是您有 2 个数字而不是 1 个。根据您的情况合法的情况,您可以简单地添加一个单独处理每个 pid 的循环(for pid in $PID
...)。