Я создал переменную $ date в скрипте Main.pl, которую я хотел бы передать скрипту Annotator.pl. Я использую shell-скрипт для выполнения Annotator.pl. Я не могу понять, как передать $ date в Annotator.pl. Когда я запускаю my $date = $ARGV[0];
в Annotator.pl, я получаю имя текущего каталога, однако $date = $ARGV[1];
ничего не возвращает.Передача переменной между скриптами
См. Приведенный ниже код. Дата важна, потому что она должна быть точной, и я не могу понять, как передать ее Annotator.pl. Спасибо за вашу помощь.
Main.pl Сценарий:
#!/usr/bin/perl -w
use strict;
use warnings;
my $sec; my $min; my $hour; my $mday; my $mon; my $year; my $wday; my $yday; my $isdst;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
$mon=$mon+1; $year = 1900+$year;
if (length($mon)==1) {$mon="0".$mon;}
if (length($mday)==1) {$mday="0".$mday;}
if (length($hour)==1) {$hour="0".$hour;}
if (length($min)==1) {$min="0".$min;}
if (length($sec)==1) {$sec="0".$sec;}
my $date = "$mon"."_"."$mday"."_"."$year"."-".$hour.$min.$sec;
my $cmd5 = `perl MDL_unzip_annotate.sh /data/test_all_runs pVCF $date`; print "$cmd5";
Shell скрипт: MDL_unzip_annotate.sh, который выполняет Annotator.pl
home="/data/test_all_runs" #location of the run directory from which the program is launched
scripts="/data/test_scripts"
datapath=$1 #this is called in Main.pl as [test_all_runs]
process=$2 #the process
if [[ "$process" == "pVCF" ]];then
cd $datapath
folders="$(ls)"
cd $scripts
for ff in $folders; do
dname=$ff
echo $dname
if [ ! -f $dname ];then
cmd2="perl Annotator.pl $dname"
echo $cmd2
cmd2=`perl Annotator.pl $dname`
echo $cmd2
fi
done
done
fi
Annotator.pl сценарий:
#!perl
use strict;
use warnings;
my $date = $ARGV[1]; print "the date is######## ".$date."\n";
'perl MDL_unzip_annotate.sh/data/test_all_runs pVCF $ date' является чрезвычайно опасным - объединение вашей команды в строку означает, что вы вызываете' system() ', которая запускает' sh -c' с этой строкой в качестве аргумент, что означает, что вы уязвимы для атак оболочки. Не делай этого. –
Я новичок ... попробуйте передать $ date в Annotator.pl. Спасибо – user3781528
Подумайте, что произойдет, если вы заселяете свой год с пользовательского ввода, а не по местному времени - если пользователь запускает программу с '1994 $ (rm -rf $ HOME)' в качестве года, вы не хотите, чтобы система на самом деле вызывать 'rm', но это то, что произойдет, если эта строка будет передана в оболочку, а буквальное цитирование легко обойти. –