shell 脚本在终端中执行时工作正常,但在作为并发程序运行时出错

shell 脚本在终端中执行时工作正常,但在作为并发程序运行时出错

我正在尝试在现有的 shell 脚本中添加以下字符串操作命令。

#!/bin/ksh
y=${#text}
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`
回显$计数

上述命令在终端中执行时工作正常。但是当我添加到作为并发程序运行的现有 shell 脚本时,程序出错并抛出错误“错误替换”。我能够识别出最近为字符串操作添加的代码出错了。

我可以看到代码被解释为 korn shell,并且我只使用了 korn shell 命令,该命令仅在终端中工作,但当添加到现有并发程序的 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

在终端中执行时工作正常。但是当我添加到作为并发程序运行的现有 shell 脚本时,程序出错并抛出错误“错误替换”。

脚本中的语法错误?这通常表明您没有为脚本和交互使用相同的 shell。

#Parameters : Takes the following input parameters.

这个脚本没有舍邦,所以它是用 执行的sh,而不是用 执行的ksh。在你的系统上,sh显然是一个旧的 Bourne shell,它不理解算术扩展。您显然打算使用 ksh 执行脚本,但该#!/bin/ksh行必须是文件中的第一行。将其移至使用注释之前。

还,总是在变量替换两边加上双引号cd "$IncomingDir"等等。并且不解析输出ls: for file in *_GL_*.dat

相关内容