Я столкнулся с проблемой при попытке запустить скрипт в ОС 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
либо PID
не определено, что, скорее всего, приведет к тому, что строка 15 будет выглядеть примерно так:
if [[ -eq 12345 ]];then
что было бы синтаксической ошибкой. Вы можете смягчить это, заключив переменные в кавычки (например, "$PID"
вместо $PID
).
Кстати, полезно видеть, что происходит во время работы вашего скрипта. Это немного портит вывод, но для проблемных разделов вашего скрипта добавьте префикс what's misbehavior, set -x
и ваш стандартный вывод теперь будет включать команду за командой, что отправляется в оболочку, которая запускает скрипт.
решение2
Сообщение об ошибке показывает два числа. Это, кажется, идентификаторы процессов. Вероятный ответ — ваша строка
PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`
находит 2 файла, и вы получаете эти 2 pid, установленные в переменной, разделенные новой строкой. При использовании в у if [[ $PSPID -eq $PID ]]
вас будет 2 числа после -eq
, что является синтаксической ошибкой.
Вам следует заключать переменные в двойные кавычки (например, "$PID"
), чтобы избежать этого типа синтаксической ошибки, хотя, очевидно, реальная проблема заключается в том, что у вас было 2 числа вместо 1. В зависимости от того, что допустимо в вашей ситуации, вы можете просто добавить цикл, обрабатывающий каждый pid отдельно ( for pid in $PID
...).