我正在尝试在现有的 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
。