Как передать переменную цикла 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/'
Немного неуклюжий, но все равно один язык.