RedHat OS でスクリプトを実行すると算術構文エラーが発生する

RedHat OS でスクリプトを実行すると算術構文エラーが発生する

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のようです。おそらく、あなたの行は

PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`

は 2 つのファイルを検索し、これらの 2 つの pid を改行で区切って変数に設定しています。 で使用すると、if [[ $PSPID -eq $PID ]]の後に 2 つの数字が付きますが-eq、これは構文エラーです。

この種の構文エラーを回避するには、変数を二重引用符で囲む必要があります (例"$PID")。ただし、実際の問題は、1 つの数値ではなく 2 つの数値があることです。状況に応じて、各 pid を個別に処理するループを追加するだけで済みます ( for pid in $PID...)。

関連情報