0

我试图在 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

.ksh更糟糕的是,当我在 PuTTY 中直接运行以下命令时,它可以工作,所以这似乎是我试图从文件中调用 perl 代码的方式(即使我已经看过几个做类似事情的例子):

perl -pi.bak -e 's/^/hi|/' /path/data/file_Im_working_with.txt

如果重要的话,日志文件也不是我想要的。而不是为每个 sqlldr 调用创建大量它们,而是每次都覆盖它log0.txt。我已经检查过了,数据文件的位置和所有内容都正确,所以这可能是我的问题的一部分或完全不相关的问题。

提前致谢!

编辑

除了 ThisSuitIsBlackNot 和 dms 所说的,我也不需要指定 perl 在这个系统上的位置,这样做实际上是把它搞砸了,这很奇怪,因为我检查了 perl 的东西在那里。

4

2 回答 2

3

看起来您正在echo执行 perl 命令,但实际上并未运行它。

于 2013-08-09T22:09:07.783 回答
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

(回声不是运行命令所必需的)

于 2013-08-09T22:12:52.763 回答