我想在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;
}
答案 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