Beim Versuch, ein Skript im RedHat-Betriebssystem auszuführen, tritt ein Problem auf. Es wird ein arithmetischer Syntaxfehler angezeigt.
Hier ist das Skript, das ich ausführen möchte:
#!/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 ""
Das Problem ist, dass ich an meiner Zeile 15 nichts Falsches sehe, da ich keine Regel von Unix sehe, die verletzt wurde, sodass es einen arithmetischen Syntaxfehler gab, oder übersehe ich etwas? Darf ich Sie Experten um Rat fragen? Jede Hilfe wäre sehr willkommen. Danke.
Antwort1
Die Zeilen 14 und 15 des Skripts lauten:
PSPID=`/bin/ps -eo pid | grep -w $PID`
if [[ $PSPID -eq $PID ]];then
Wenn in Zeile 15 ein Fehler auftritt, liegt dies höchstwahrscheinlich daran, dass entweder „ PSPID
oder“ PID
nicht definiert ist, was wahrscheinlich dazu führt, dass Zeile 15 in etwa wie folgt aussieht:
if [[ -eq 12345 ]];then
Dies wäre ein syntaktischer Fehler. Sie können dies abmildern, indem Sie Ihre Variablen in Anführungszeichen setzen (z. B. "$PID"
statt $PID
).
Nebenbei bemerkt ist es hilfreich zu sehen, was passiert, während Ihr Skript ausgeführt wird. Dadurch wird die Ausgabe ein wenig verfälscht, aber bei problematischen Abschnitten Ihres Skripts können Sie „what's misbehaving“ (was sich schlecht verhält) mit dem Präfix versehen, set -x
und Ihre Standardausgabe enthält nun Befehl für Befehl, was an die Shell gesendet wird, die das Skript ausführt.
Antwort2
Die Fehlermeldung zeigt zwei Zahlen. Dies scheinen Prozess-IDs zu sein. Eine wahrscheinliche Antwort ist, dass Ihre Zeile
PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`
findet 2 Dateien und Sie erhalten diese 2 PIDs in der Variable, getrennt durch eine neue Zeile. Bei Verwendung in if [[ $PSPID -eq $PID ]]
haben Sie 2 Zahlen nach dem -eq
, was den Syntaxfehler darstellt.
Sie sollten Ihre Variablen in doppelte Anführungszeichen setzen (z. B. "$PID"
), um diese Art von Syntaxfehler zu vermeiden, obwohl das wirkliche Problem offensichtlich darin liegt, dass Sie 2 Zahlen statt 1 hatten. Je nachdem, was in Ihrer Situation zulässig ist, können Sie einfach eine Schleife hinzufügen, die jede PID separat verarbeitet ( for pid in $PID
...).