기존 쉘 스크립트에 다음 문자열 조작 명령을 추가하려고 합니다.
#!/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
위 명령은 터미널에서 실행하면 제대로 작동합니다. 그러나 동시 프로그램으로 실행되는 기존 쉘 스크립트에 추가하면 프로그램에서 오류가 발생하고 "잘못된 대체" 오류가 발생합니다. 최근 추가된 문자열 조작용 코드가 잘못되어 있는 것을 확인할 수 있었습니다.
코드가 콘 쉘로 해석되는 것을 볼 수 있는데, 터미널에서만 작동하는 콘 쉘 명령을 방금 사용했는데 기존 동시 프로그램의 유닉스 스크립트에 추가하면 오류가 발생합니다.
다음은 기존 스크립트의 코드와 새로 추가된 명령입니다.
#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
줄은 파일의 첫 번째 줄이어야 합니다. 주석을 사용하기 전에 이동하세요.
반품,변수 대체에는 항상 큰따옴표를 사용하세요.: cd "$IncomingDir"
등. 그리고출력을 구문 분석하지 않습니다.ls
: for file in *_GL_*.dat
.