쉘 스크립트는 터미널에서 실행될 때 잘 작동하지만 동시 프로그램으로 실행될 때 오류가 발생합니다.

쉘 스크립트는 터미널에서 실행될 때 잘 작동하지만 동시 프로그램으로 실행될 때 오류가 발생합니다.

기존 쉘 스크립트에 다음 문자열 조작 명령을 추가하려고 합니다.

#!/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.

관련 정보