2012-01-23 10 views
11

Sto cercando di modificare alcuni script con una combinazione di Bash e Perl. Il guaio è che Perl pensa che $index è la sua propria variabile, che non viene mai definito:Come posso passare la variabile del ciclo Bash all'interprete Perl?

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

C'è un modo per rendere $index indossare il suo mantello Bash all'interno del Perl one-liner?

+0

'$ index_' è un nome di simbolo valido sia in Perl che in bash. Forse vuoi usare un delimitatore diverso per l'operatore 's ///'? – mob

+0

@mob: Sì, stavo per cambiare ... stavo cercando di rendere più leggibile e confuso le cose nel processo: | – Zaid

+0

@mob: delimitatori Regex modificati – Zaid

risposta

19

Spremere un export index; nel ciclo do. Fare riferimento a $ENV{index} nel corpo del programma Perl.

In alternativa: utilizzare le virgolette "… $index … " per interpolare la variabile di shell nell'espressione che costituisce il corpo del programma Perl. Nel caso in cui si desideri espandere questo one-liner, fare attenzione a evitare espressioni Perl come ad esempio $ sui nomi di variabili e forse barre rovesciate, in modo che siano interpretate da Perl, non dalla shell.

+0

Questo è il migliore, _provided_ 'index' è stato esportato da bash. Puoi farlo prima del ciclo o durante questo. –

+0

Grazie per il TIMTOWTDI – Zaid

7

Utilizzare " anziché '. La bash può quindi sostituire la variabile prima che perl la veda.

2

Utilizzare le virgolette anziché le virgolette singole e l'indice $ verrà interpolato prima che la stringa -e venga passata a Perl.

2

Ecco un esempio di lavoro (anche se non nei termini del vostro problema - scusate!):

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

Non è probabile che interferisca con la gestione '-pi' di Perl? –

+0

Ha funzionato bene per me! Non è necessario esportare la variabile. Funziona con le vars dichiarate localmente all'interno del tuo script. – wmorrison365

+0

cioè questo modo di passare vars a perl non influisce su "-pi". Funziona bene. Il mio uso di un ciclo in questo ad es. può influire su "-pi" ma, è solo un es. – wmorrison365

1

Credo che il problema qui è che le gocce di shell bash non supportano gli intervalli. Per qualche ragione, pensavo che lo facessero. Non importa, Perl supporta gamme più che bene:

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

Un po 'goffo, ma è tutto una lingua in ogni caso.

+0

Sapevi che il blocco 'BEGIN' potrebbe essere incastrato tra il bacio eschimese :)? : '$ $ perl -e '...} INIZIA {...'' – Zaid

+0

@Zaid Forse sì, ma questo sta sacrificando un sacco di logica per salvare una parentesi graffa che vale la pena di digitare. = P – TLP

+0

+1, bel judo sull'attività – daxim

Problemi correlati