2012-10-26 15 views
9

Come utilizzare le variabili di shell nella chiamata al comando perl in uno script di shell bash?Come utilizzare le variabili di shell nella chiamata al comando perl in uno script di shell bash?

Ho un comando perl nel mio script di shell per valutare la data -1.

Come è possibile utilizzare $myDate nella chiamata al comando perl?

Questa è la sezione nel mio script:

myDate='10/10/2012' 

Dt=$(perl -e 'use POSIX;print strftime '%m/%d/%y', localtime time-86400;") 

voglio usare $myDate al posto di %m/%d/%y.

Qualsiasi aiuto sarà apprezzato.

Grazie.

+1

Sostituzione ' '% m /% d /% y'' con il valore di' myDate' non ha alcun senso se non si modifica il valore di 'myDate' a qualcosa come'% m /% d /% y'. Per favore aggiusta la tua domanda in modo appropriato. – ikegami

risposta

3

Allo stesso modo in cui si passano valori a qualsiasi altro programma: passarlo come arg. (Si potrebbe essere tentati di generare codice Perl, ma questo è una cattiva idea.)

Dt=$(perl -MPOSIX -e'print strftime $ARGV[0], localtime time-86400;' -- "$myDate") 

Si noti che il codice non restituisce sempre la data di ieri (dal momento che non tutti i giorni hanno 86400 secondi). Per questo, che ci si vuole

Dt=$(perl -MPOSIX -e'my @d = localtime time-86400; --$d[4]; print strftime $ARGV[0], @d;' -- "$myDate") 

o

Dt=$(perl -MDateTime -e'print DateTime->today(time_zone => "local")->subtract(days => 1)->strftime($ARGV[0]);' -- "$myDate") 

o semplicemente

Dt=$(date --date='1 day ago' +"$myDate") 
+0

Questo post presuppone che tu voglia utilizzare 'myDate' come identificatore di formato come hai detto, il che significa che' myDate' contiene in realtà qualcosa come '% m /% d /% y'. – ikegami

0

Lo stesso modo in cui si passa i valori di qualsiasi altro programma: passare come un ARG. (Si potrebbe essere tentati di generare codice Perl, ma questo è una cattiva idea.)

Dt=$(perl -MPOSIX -e'my($m,$d,$y) = split qr{/}, $ARGV[0]; --$d; print strftime "%m/%d/%y", 0,0,0, $d,$m-1,$y-1900;' -- "$myDate") 
+0

In questo post si presuppone che si desideri utilizzare 'myDate' come la data da modificare piuttosto che l'identificatore di formato. – ikegami

19

Variabili dalla shell sono disponibili in %ENV hash di Perl. Con bash (e alcune altre shell) è necessario eseguire il passaggio extra di "esportazione" della variabile shell in modo che sia visibile ai sottoprocessi.

mydate=10/10/2012 
export mydate 
perl -e 'print "my date is $ENV{mydate}\n"' 
+4

Questa è una semplice risposta che governa. Quello sopra sembra solo un complicato codice complicato che non riesco a capire –

+0

Inoltre, se si esegue 'perl -p', quindi interpreta' --' come un nome file, quindi è possibile usare solo $ ENV in tali script – sdbbs

1

Perché non qualcosa di simile: $ENV{'PATH'} = $ENV{'PATH'}.":"."/additional/path";

2

Utilizzando " invece di ' passa anche variabili di shell a Perl versione 5.24.

mydate=22/6/2016 
perl -e "print $mydate" 
+0

Questo è ciò che Ikegami sconsiglia nella risposta accettata, per una buona ragione. Se hai il controllo completo su 'mydate' e capisci cosa stai facendo, interpolandolo come codice Perl va bene ...ma questo non è certamente vero in questo caso, e quindi questo frammento produrrà output erratico '0.00181878306878307'. – tripleee

Problemi correlati