既存のシェルスクリプトに次の文字列操作コマンドを追加しようとしています。
#!/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"
など。そして出力を解析しません。ls
:for file in *_GL_*.dat
。