2012-01-23 9 views
11

Próbuję zmodyfikować niektóre skrypty za pomocą kombinacji Bash i Perl. Problem polega na tym, że Perl uważa, że ​​jest swoim własnym $index zmienna, która nigdy nie jest zdefiniowana:Jak mogę przekazać zmienną pętli Bash do interpretera Perla?

for index in {1..25}; do 
    perl -pi -e 's/\d+/$index/' cmd_$index.sh; 
done 

Czy istnieje sposób, aby $index nosić swój płaszcz w Bash Perl jednej wkładki?

+0

'$ index_' jest poprawną nazwą symbolu zarówno w Perlu, jak i bash. Może chcesz użyć innego ogranicznika dla operatora 's ///'? – mob

+0

@mob: Tak, zamierzałem to zmienić ... starałem się, aby było bardziej czytelne i pomieszane w procesie: | – Zaid

+0

@mob: Ograniczniki Regex zostały zmienione – Zaid

Odpowiedz

19

Ściśnij export index; w pętli do. Patrz: $ENV{index} w treści programu Perl.

Alternatywnie: Użyj podwójnego cudzysłowu "… $index … ", aby wstawić zmienną powłoki do wyrażenia, które składa się na treść programu Perla. Jeśli chcesz rozszerzyć tę jedną linijkę, upewnij się, że poprawnie unikasz wyrażeń Perla, takich jak $ na nazwach zmiennych, a może w ukośnikach odwrotnych, które są interpretowane przez Perla, a nie przez powłokę.

+0

To jest najlepszy, _provided_ 'index' został wyeksportowany z bash. Możesz to zrobić przed pętlą lub podczas niej. –

+0

Dzięki za TIMTOWTDI – Zaid

7

Użyj " zamiast '. Bash może następnie podstawić zmienną, zanim perl ją zobaczy.

2

Użyj podwójnych cudzysłowów zamiast pojedynczych cudzysłowów, a indeks $ zostanie interpolowany przed przekazaniem ciągu e-e do Perla.

2

Oto przykład działa (choć nie w kategoriach problemu - sorry!):

generatep() { 
    perl -e ' 
     $_stem=$ARGV[0]; 
     $_ctx=$ARGV[1]; 
     $_role=$ARGV[2]; 
     $i=$ARGV[3]; 
     $ct=$i + $ARGV[4]; 
     while ($i < $ct) { 
      print "user=$_stem$i,$_ctx,$_role\n"; 
      $i++; 
     } 
    ' ${stem} ${ctx} ${role} ${startix} ${count} 
} 
+0

Czy to nie zakłóci obsługi "-pi" Perla? –

+0

To działa dobrze dla mnie! Nie musisz eksportować również zmiennej. Działa z vars zadeklarowanymi lokalnie w twoim skrypcie. – wmorrison365

+0

, tj. Ten sposób przekazywania vars do perla nie wpływa na "-pi". Działa w porządku. Moje wykorzystanie pętli w tym, np. może wpływać na "-pi", ale jest to po prostu np. – wmorrison365

1

Chyba problem jest to, że globs powłoki bash nie obsługuje zakresy. Z jakiegoś powodu, myślałem, że tak. Nieważne, perl obsługuje następujące zakresy:

perl -pi -e ' 
    BEGIN { @ARGV = map "cmd_$_.sh", 1 .. 25; } 
    my ($index) = $ARGV =~ /(\d+)/; 
    s/\d+/$index/' 

Trochę niezgrabny, ale w każdym razie jest to tylko jeden język.

+0

Czy wiesz, że blok "BEGIN" mógł zaklinować się pomiędzy pocałunkiem Eskimosów :)? : '$ perl -e '...} BEGIN {...'' – Zaid

+0

@Zaid Może tak, ale to poświęcenie dużej ilości logiki, aby zapisać jeden nawias klamrowy warty pisania. = P – TLP

+0

+1, niezły judo w zadaniu – daxim

Powiązane problemy