シェルスクリプトは端末で実行するとうまく動作しますが、同時プログラムで実行するとエラーが発生します。

シェルスクリプトは端末で実行するとうまく動作しますが、同時プログラムで実行するとエラーが発生します。

既存のシェルスクリプトに次の文字列操作コマンドを追加しようとしています。

#!/bin/ksh
y=${#テキスト}
echo "テキスト長: $y"
echo "最後の _ は $((${#text} - ${#end})) 列にあります。"
" echo "私たちの位置は、$((${#text} - ${#end}-$x)) 列までです。

len=`expr $((${#text} - ${#end}-$x))`
エコ$len

val=$( echo $text $len|awk '{print substr($0,0,$2)}')

エコ$val
個数= `ls $val*|wc -l`
エコ$count

上記のコマンドは端末で実行すると正常に動作します。ただし、同時プログラムとして実行される既存のシェルスクリプトに追加すると、プログラムでエラーが発生し、「無効な置換」エラーが発生します。最近追加された文字列操作用のコードが間違っていることを確認できました。

コードがコーンシェルとして解釈されることがわかりますが、端末でのみ機能するコーンシェルコマンドを使用したばかりで、既存の同時プログラムのUnixスクリプトに追加するとエラーが発生します。

以下は、既存のスクリプトのコードと新しく追加されたコマンドです。

#Parameters : Takes the following input parameters.
# 1) Input base directory   -- parameter 5
# 2) File Pattern           -- Parameter 6
# 3) Appl short name        -- parameter 7
# 4) appl. resp.            -- parameter 8
# 5) Debug                  -- parameter 9
#=======================================================================
#!/bin/ksh
AppsUser="$3"
BaseDir="$5"
FilePattern="$6"
AppShortName="$7"
AppResp="$8"
DebugProgram="$9"

echo "Apps User=$AppsUser"
echo "Base Directory=$BaseDir"
echo "File Pattern=$FilePattern"
echo "App Short Name=$AppShortName"
echo "App Responsibility=$AppResp"
echo "Debug Program=$DebugProgram"

IncomingDir="$BaseDir/incoming"
ProcessedDir="$BaseDir/processed"
ProcessingDir="$BaseDir/processing"
TempFile="$BaseDir/incoming/absn_psoft_glfile_search_results.txt"
ConcProgram="ABSN_PEOPLESOFT_OGL_INTF_MAIN"
echo $ConcProgram
echo $TempFile
IFS="
"
export IFS

cd $IncomingDir
ls *_GL_*.dat 1> /dev/null 2> /dev/null
if [ $? = 0 ]
then
    #for i in `cat $TempFile`
    for file in `ls *_GL_*.dat`
     do
      echo "File being processed $file"
       FILENAME=$file
       #echo $FILENAME
       len=${#FILENAME} -->Error thrown for this command
       echo "The length is $len"
       if [ -s $FILENAME ]
        then
      echo "Moving file $FILENAME to $ProcessingDir"
      mv $IncomingDir/$FILENAME $ProcessingDir/$FILENAME
      echo "Submitting concurrent Request using CONCSUB for File=$FILENAME"
      CONCSUB $FCP_LOGIN $AppShortName $AppResp $AppsUser WAIT=N CONCURRENT ABSN $ConcProgram  $FILENAME 0 $DebugProgram $ProcessingDir
      echo "Submitted Request for File=$FILENAME"
      sleep 60
      else
          echo "File size is 0 bytes, moving file to processed directory"
          mv $IncomingDir/$FILENAME $ProcessedDir/$FILENAME.rmv
      fi
    done
else
  echo "No GL PSoft files to process."
fi
#echo "After if"
echo "Completed Job, Exiting program with code 0"
exit 0

スクリプトはOracle同時プログラムに実行可能ファイルとして添付され、同時プログラムを使用して実行されます。

答え1

端末で実行するとうまくいきます。ただし、同時プログラムとして実行される既存のシェルスクリプトに追加すると、プログラムでエラーが発生し、「無効な置換」エラーが発生します。

スクリプトの構文エラー?これは通常、スクリプトと対話に同じシェルを使用しないことを示します。

#Parameters : Takes the following input parameters.

このスクリプトはそうではありませんシェルボーンしたがって、実行shではなく実行を使用しますksh。あなたのシステムには、sh算術拡張を理解していない古いBourneシェルがあるようです。明らかにkshを使用してスクリプトを実行しようとしていますが、この#!/bin/ksh行はファイルの最初の行でなければなりません。コメントを使用する前に移動してください。

返品、変数の置換には常に二重引用符を使用してください。a :cd "$IncomingDir"など。そして出力を解析しません。lsfor file in *_GL_*.dat

関連情報