RedHat OS에서 스크립트를 실행하려고 할 때 문제가 발생합니다. 산술 구문 오류가 발생합니다.
이제 이것은 내가 실행하려는 스크립트입니다.
#!/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행에서 아무 문제도 발견되지 않는다는 것입니다. 아니면 뭔가 빠졌습니까? 어떤 전문가가 어떤 제안을 합니까? 어떤 도움이라도 대단히 감사하겠습니다. 감사해요.
답변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
이를 완화 할 수 있습니다.
그런데 스크립트가 실행될 때 무슨 일이 일어나는지 아는 것이 도움이 됩니다. 출력을 약간 수정하지만, 문제가 있는 스크립트 부분의 경우 오작동하는 부분 앞에 접두사를 붙이면 set -x
이제 표준 출력에는 스크립트를 실행하는 셸에 명령별로 전송되는 내용이 포함됩니다.
답변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"
하지만 실제 문제는 1이 아닌 2개의 숫자가 있다는 것입니다. 귀하의 경우에 적법한 사항에 따라 for pid in $PID
각 PID를 개별적으로 처리하는 루프( ...)를 간단히 추가할 수 있습니다 .