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 ""
問題は、算術構文エラーがUnixのどの規則に違反しているのかを見ることができないため、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
エラーメッセージには2つの数字が表示されます。これはプロセスIDのようです。考えられる答えの1つはパスです。
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を個別に処理するループ(...)を簡単に追加できます。