如何将Perl程序中的值返回到Korn-shell脚本?

时间:2010-05-10 13:35:03

标签: perl unix shell ksh

我想在shell脚本中执行此操作:

#!/usr/bin/ksh

PERL_PATH=/usr/local/bin/perl

RET1=$(${PERL_PATH} missing_months_wrap.pl)

echo $RET1

我该怎么做?

如上所述调用perl脚本会给我一个错误:

> shell.sh
Can't return outside a subroutine at missing_months_wrap.pl line 269.

编辑:在perl脚本中,语句是:

unless (@pm1_CS_missing_months)
{
$SETFLAG=1;
}

my @tmp_field_validation = `sqlplus -s $connstr \@DLfields_validation.sql`;

unless (@tmp_field_validation)
{
$SETFLAG=1;
}

if ($SETFLAG==1)
{
return $SETFLAG;
}

3 个答案:

答案 0 :(得分:2)

您需要修改Perl脚本,以便它输出您需要的值(到stdout),然后您可以在shell脚本中使用该值。

答案 1 :(得分:2)

shell脚本可以从$?中的Perl脚本中检索退出状态。变量,或Perl脚本的输出,如果用反引号或子shell调用它。

perl test.pl
VAR=$?

一定要拿到$?在Perl脚本调用之后的值,因为它可能会改变。

VAR=`perl test.pl`

或     VAR = $(perl test.pl)

使用第二种方法,变量可以是一个字符串,第一个,它必须是0到255之间的整数值。

答案 2 :(得分:1)

shell脚本中对RET1的赋值运行Perl命令并捕获其标准输出。要使Perl程序继续运行,请将条件最后更改为

if ($SETFLAG==1)
{
  print $SETFLAG;
}

运行它会产生

1

另一种方法是使用Perl程序的退出状态。 shell.sh包含

#! /usr/bin/ksh
RET1=$(${PERL_PATH} missing_months_wrap.pl)
echo $?

并将missing_months_wrap.pl中的最后一个条件更改为

if ($SETFLAG==1)
{
  exit $SETFLAG;
}

你得到相同的输出:

$ PERL_PATH=/usr/bin/perl ./shell.sh 
1