2012-10-26 1 views
9

Wie verwendet man Shell-Variablen in perl-Befehlsaufruf in einem Bash-Shell-Skript?Wie verwendet man Shell-Variablen in Perl-Befehlsaufrufen in einem Bash-Shell-Skript?

Ich habe einen Perl-Befehl in meinem Shell-Skript, um Datum -1 auszuwerten.

Wie kann ich $myDate in Perl Befehlsaufruf verwenden?

Dies ist der Abschnitt in meinem Skript:

myDate='10/10/2012' 

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

ich anstelle von %m/%d/%y verwenden $myDate will.

Jede Hilfe wird geschätzt.

Vielen Dank.

+1

Ersetzen ' '% m /% d /% y'' mit dem Wert von' myDate' macht keinen Sinn, wenn Sie den Wert 'myDate' um so etwas wie'% m /% d ändern /% y'. Bitte korrigieren Sie Ihre Frage entsprechend. – ikegami

Antwort

3

Auf die gleiche Weise, wie Sie Werte an ein anderes Programm übergeben: Übergeben Sie es als Arg. (Sie könnten versucht sein, Perl-Code zu generieren, aber das ist eine schlechte Idee.)

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

Beachten Sie, dass Code nicht immer die gestrige Datum zurückzukehren (da nicht alle Tage haben 86.400 Sekunden). Dafür würden Sie

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

oder

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

oder einfach

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

In diesem Post wird davon ausgegangen, dass Sie 'myDate' als Formatspezifizierer verwenden möchten, wie Sie sagten, was bedeutet, dass' myDate' tatsächlich etwas wie '% m /% d /% y' enthält. – ikegami

0

Auf die gleiche Weise können Sie Werte für alle anderen Programme geben wollen: Übergeben Sie es als arg. (Sie könnten versucht sein, Perl-Code zu generieren, aber das ist eine schlechte Idee.)

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 diesem Post wird davon ausgegangen, dass Sie tatsächlich "meinDatum" als zu bearbeitendes Datum und nicht als Formatspezifizierer verwenden möchten. – ikegami

19

Variablen aus der Schale sind in %ENV Hash Perl. Mit bash (und einigen anderen Shells) müssen Sie die Shell-Variable extra exportieren, damit sie für Unterprozesse sichtbar ist.

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

Dies ist eine einfache Antwort, die Regeln. Das obige sieht nur aus wie ein verschachtelter komplexer Code, den ich nicht verstehen kann. –

+0

Wenn Sie 'perl -p' ausführen, dann interpretiert es' '' als Dateinamen, so dass nur $ ENV verwendet werden kann Solche Skripte – sdbbs

1

Warum nicht so etwas wie: $ENV{'PATH'} = $ENV{'PATH'}.":"."/additional/path";

2

Mit " statt ' geht auch Shell-Variablen in der Version 5.24 Perl.

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

Dies ist, was Ikegami in der angenommenen Antwort aus gutem Grund empfiehlt. Wenn Sie die vollständige Kontrolle über "mydate" haben und verstehen, was Sie tun, interpolieren Sie es als Perl-Code ist in Ordnung ...aber das ist in diesem Fall sicherlich nicht wahr, und so wird dieser Ausschnitt eine fehlerhafte Ausgabe "0,00181878306878307" erzeugen. – tripleee