2012-10-26 10 views
9

Jak używać zmiennych powłoki w poleceniu perl w skrypcie powłoki bash?Jak używać zmiennych powłoki w poleceniu perl w skrypcie powłoki bash?

Mam polecenie perl w moim skrypcie powłoki do oceny daty -1.

Jak korzystać z $myDate w wywołaniu polecenia perl?

Jest to sekcja w moim skryptu:

myDate='10/10/2012' 

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

chcę używać $myDate zamiast %m/%d/%y.

Każda pomoc zostanie doceniona.

Dziękuję.

+1

Wymiana ' '% m /% d /% y'' z wartością' myDate' nie ma żadnego sensu, chyba że zmiany wartości 'myDate' do czegoś podobnego'% m /% d /% y'. Popraw poprawne pytanie. – ikegami

Odpowiedz

3

W ten sam sposób przekazujesz wartości do dowolnego innego programu: Podaj go jako argument. (Może ulec pokusie, aby wygenerować kod Perl, ale to zły pomysł.)

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

Należy pamiętać, że kod nie zawsze powrócić wczorajszą datę (dzień, ponieważ nie wszystkie mają 86400 sekund). Za to, że chcesz

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

lub

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

lub po prostu

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

Ten post zakłada, że ​​chcesz użyć 'myDate' jako specyfikatora formatu, tak jak powiedziałeś, co oznacza, że' myDate' zawiera coś w stylu '% m /% d /% y'. – ikegami

0

Ten sam sposób można przekazać wartości do innego programu: Przepuścić go jako arg. (Może ulec pokusie, aby wygenerować kod Perl, ale to zły pomysł.)

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

Ten post zakłada, że ​​faktycznie chcesz użyć 'myDate' jako daty do modyfikacji zamiast specyfikacji formatu. – ikegami

19

zmienne z powłoki są dostępne w Perl %ENV hash. Przy bash (i kilku innych powłokach) musisz wykonać dodatkowy krok "eksportowania" zmiennej powłoki, aby była widoczna dla podprocesów.

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

To jest prosta odpowiedź, która rządzi. Ten powyżej wygląda jak skomplikowany skomplikowany kod, którego nie mogę zrozumieć. –

+0

Również, jeśli uruchomisz 'perl -p', to interpretuje on' --' jako nazwę pliku, więc możliwe jest użycie $ ENV w takie skrypty – sdbbs

1

Może coś takiego: $ENV{'PATH'} = $ENV{'PATH'}.":"."/additional/path";

2

Korzystanie " zamiast ' przechodzi również zmienne powłoki do perl w wersji 5.24.

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

Tego właśnie zaleca Ikegami w przyjętej odpowiedzi, nie bez powodu. Jeśli masz pełną kontrolę nad 'mydate' i rozumiesz co robisz, interpolowanie go jako kodu Perla jest w porządku ...ale to z pewnością nie jest prawdą w tym przypadku, a więc ten fragment wygeneruje błędny wynik '0.00181878306878307'. – tripleee

Powiązane problemy