在 bash 中的 perl 命令中使用 bash 变量

Nik*_*sad 2 bash perl

我需要通过 sqlplus 从 bash 脚本将变量传递给 Perl 语句,以编辑文件。它在不传递count变量的情况下工作正常,但在传递它时遇到问题。

count=$( sqlplus -s test/test <<-EOF
    set pagesize 0;
    set feedback off;
    set verify off;
    set heading off echo off;
        select count(*) from test;
    exit;
EOF)

if [ "$count" != "" ] && [ $count != "0" ]; then

    perl -lpe 'print "Total Number of Rejected Files = "$count"" if $. == 10' Results.txt >> data.txt

else

fi
Run Code Online (Sandbox Code Playgroud)

据我所知,我的问题只有这部分"$count"。我尝试了很多事情,例如:

perl -lpe 'print "Total Number of Rejected Files = $ENV{'count'}" if $. == 10' Results.txt >> data.txt

和这个 :

perl -lpe 'print "Total Number of Rejected Files = $ENV{count}" if $. == 10' Results.txt >> data.txt

但问题是 bash 变量不会通过 perl 语句扩展。

ter*_*don 6

你的$ENV方法会很好用,你只需要先导出 shell 变量。你的 perl 脚本在子 shell 中运行,所以它看到变量的唯一方法是你先导出它:

count=$( sqlplus -s test/test <<-EOF
    set pagesize 0;
    set feedback off;
    set verify off;
    set heading off echo off;
        select count(*) from test;
    exit;
EOF)

export count

if [ "$count" != "" ] && [ $count != "0" ]; then
    perl -lpe 'print "Total Number of Rejected Files = $ENV{count}" if $. == 10' Results.txt >> data.txt
fi
Run Code Online (Sandbox Code Playgroud)

不过,我对您的 perl 命令有点困惑。perl -lpe '' Results.txt意思是“在应用给-e它的脚本后打印 Results.txt 的每一行。但你实际上并没有对 Results.txt 做任何事情,那么有什么意义呢?

您的代码将简单地打印出 的每一行,Results.txt然后在第 10 行,它还将打印Total Number of Rejected Files =和 的值$count。如果这真的是你想做的,那就太好了。你实际上想要这个似乎不太可能。

  • @Fiximan 本质上,是的。Perl 是一种编程语言,而不是 shell 工具,因此内部的 `$` 是它自己的变量。在这里,通过导出 shell 变量,我们使其可用于 Perl 环境,Perl 环境可以查看哈希“%ENV”中的所有 shell 环境变量。 (3认同)