2010-05-10 103 views
3

我想這樣做在shell腳本:如何從Perl程序返回值到Korn-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; 
} 
+1

是什麼'perl的test.pl'回報?您打印的輸出是屏幕嗎? – Zaid 2010-05-10 13:39:20

回答

1

在shell腳本中對RET1的分配運行Perl命令並捕獲其標準輸出。爲了使您的Perl程序走,到了最後改變有條件的

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

運行它產生

1

另一種方法是使用Perl程序的退出狀態。含

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

和改變的最後一個條件在missing_months_wrap.pl

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

你會得到相同的輸出shell.sh

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

你會需要修改你的Perl腳本以便它輸出你需要的值(輸出到標準輸出),然後你可以在你的shell腳本中使用這個值。

2

shell腳本可以從$?中的Perl腳本中檢索退出狀態。變量或Perl腳本的輸出(如果它使用反引號或子shell調用)。

perl test.pl 
VAR=$? 

一定要拿到$?值在Perl腳本調用之後,因爲它可能會改變。

VAR=`perl test.pl` 

或 VAR = $(perl的test.pl)

在第二方法中,變量可以是一個字符串,與第一個,它必須是0和255之間的整數值。

+1

它必須是介於0和255之間的整數值。另外,不要使用反引號 - 爲了可讀性,可嵌套性和引用和轉義的簡便性,'$()'更受歡迎。 – 2010-05-10 14:05:23

+0

你說得對,會補充答案。 – philant 2010-05-10 14:56:47