Как передать переменную цикла Bash интерпретатору Perl? - PullRequest
11 голосов
/ 23 января 2012

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

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

Есть ли способ заставить $index носить плащ Bash в пределах одной строки Perl?

Ответы [ 5 ]

19 голосов
/ 23 января 2012

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

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

7 голосов
/ 23 января 2012

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

3 голосов
/ 23 января 2012

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

2 голосов
/ 23 января 2012

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

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}
}
1 голос
/ 23 января 2012

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

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

Немного неуклюже, но в любом случае это все один язык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...