Как передать переменную цикла Bash на интерпретатор Perl?

Я пытаюсь изменить некоторые скрипты с комбинацией Bash и Perl. Проблема в том, что Perl считает, что $index - это его собственная переменная, которая никогда не определяется:

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

Есть ли способ сделать $index носить плакат Bash в одном слое Perl?

Ответ 1

Сожмите export index; в цикле do. См. $ENV{index} в теле программы Perl.

Альтернативно: используйте двойные кавычки "… $index … " для интерполяции переменной оболочки в выражение, которое составляет тело программы Perl. Если вы хотите развернуть этот однострочный лайнер, позаботьтесь о том, чтобы правильно вывести выражения Perl, например $, на имена переменных и, возможно, обратные косые черты, которые интерпретируются Perl, а не оболочкой.

Ответ 2

Используйте " вместо '. bash может затем заменить переменную, прежде чем perl увидит ее.

Ответ 3

Используйте двойные кавычки вместо одиночных кавычек, а индекс $index будет интерполирован до передачи строки -e на Perl.

Ответ 4

Вот рабочий пример (хотя и не в терминах вашей проблемы - извините!):

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}
}

Ответ 5

Я предполагаю, что проблема в том, что глобальные оболочки оболочки bash не поддерживают диапазоны. По какой-то причине, я думал, они это сделали. Неважно, perl поддерживает диапазоны просто отлично:

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

Немного неуклюжий, но все равно один язык.