我正在尝试在ksh文件中运行一些perl而没有得到我对它的期望。如果我在做一些语法不正确的事情,而不是简单地得到某种错误,它就会完成运行并创建大量的.bak
文件,但没有像我期望的那样在文件的每一行上加上$data
。
到目前为止我已经得到了什么(contains
是我之前在文件中声明的函数,但该部分工作正常):
if [[ $# != 3 ]];then
echo "Please specify 1 folder containing data files as well as 1 from and 1 to system id."
else
for file in `ls $1`;do
filePath=$1$file
fileName=`echo $filePath | awk -F'/' '{print$5}'`
contains $fileName "ACCUMS" && (
contains $fileName ".bak" || (
echo "Loading file: "$fileName
date=echo $fileName | awk -F'_' '{print$5}' | sed 's/.txt//'
data=$fileName"|"$2"|"$3"|"$date"|"
echo $data
echo /usr/local/bin/perl -pi.bak -e 's/^/$data/' $filePath
logFile="log"$curFile".txt"
echo "Log file: "$logFile
echo "Done loading file: "$fileName
$ORACLE_BIN/sqlldr user/pass@server control=control_file.ctl data=$filePath log=$logFile
curFile=$curFile+1
)
) || echo $fileName" not part of Accums. Skipped."
done
fi
当我在PuTTY中直接运行以下内容时,它会变得更糟,所以它似乎是我试图调用perl代码的方式(尽管我看了几个做类似事情的例子)来自.ksh
文件:
perl -pi.bak -e 's/^/hi|/' /path/data/file_Im_working_with.txt
如果重要,日志文件也不是我想要的。而不是为每个sqlldr调用创建它们,而不是每次都覆盖log0.txt
。我已经检查过,数据文件位于正确的位置以及所有内容,所以这可能是我的问题的一部分或完全不相关的内容。
提前致谢!
除了ThisSuitIsBlackNot和dms所说的,我也不需要在这个系统上指定perl的位置,这样做实际上搞砸了,这很奇怪,因为我检查过perl的东西就在那里。
答案 0 :(得分:3)
看起来你是echo
perl命令但实际上没有运行它。
答案 1 :(得分:1)
正如dms指出的那样,你正在回显perl命令,而不是执行它。此外,如果要插入变量data
,则需要使用双引号,而不是单引号。改变这个:
echo /usr/local/bin/perl -pi.bak -e 's/^/$data/' $filePath
到此:
/usr/local/bin/perl -pi.bak -e "s/^/$data/" $filePath
(运行命令不需要回声)