Выход из пробелов во вложенных сценариях оболочки / perl - PullRequest
2 голосов
/ 21 октября 2009

Я пытаюсь запустить Perl-скрипт из bash-скрипта (я изменю этот дизайн позже, но пока терпите меня). Скрипт bash получает аргумент, что он будет работать. Аргумент к сценарию выглядит следующим образом:

test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45"

в скрипте bash я просто запускаю переданный аргумент:

#!/bin/sh

$1

Однако в моем скрипте perl аргумент -g получает только "Some (это с кавычками) вместо Some Example. Даже если я процитирую это, оно обрывается из-за пробелов.

Я пытался избежать пробелов, но это не сработало ... какие-то идеи?

Ответы [ 4 ]

2 голосов
/ 21 октября 2009

Чтобы запустить как отправлено test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45" сделать это:

#!/bin/bash
eval "$1"

Это приводит к тому, что оболочка разбирает аргумент $1, поэтому отдельные слова будут разбиты, а кавычки удалены.

Или, если хотите, вы можете удалить кавычки и запустить test.sh myscript.pl -g "Some Example" -n 1 -p 45, если вы изменили свой скрипт на:

#!/bin/bash
"$@"

"$@" заменяется всеми аргументами $1, $2 и т. Д., Столько, сколько было передано в командной строке.

1 голос
/ 21 октября 2009

Я бы посоветовал вам назвать скрипт perl отдельным словом, затем вы можете указывать параметры при обращении к ним, и при этом легко извлекать имя скрипта, не используя оболочку для разделения слов, что является фундаментальной проблемой, с которой вы столкнулись. .

test.sh myscript.pl "-g \"Some Example\" -n 1 -p 45"

, а затем

#!/bin/sh
$1 "$2"
1 голос
/ 21 октября 2009

Цитирование обычно обрабатывается парсером, который не видит их, когда вы подставляете в скрипт значение $1.

У вас может быть больше удачи с:

#!/bin/sh
eval "$1"

, что дает:

$ sh test.sh 'perl -le "for (@ARGV) { print; }" "hello world" bye'  
hello world
bye

Обратите внимание, что просто заставить оболочку интерпретировать кавычки с помощью "$1" не сработает, потому что тогда она пытается обработать первый аргумент (т. Е. Всю команду) как имя команды, которая будет выполнена. Вам нужно пройти через eval, чтобы получить правильное цитирование и затем повторный анализ команды.

Этот подход (очевидно?) Опасен и сопряжен с угрозами безопасности.

0 голосов
/ 21 октября 2009

если вам действительно нужно сделать это (по какой-либо причине), почему бы просто не сделать:

sh test.sh "'Некоторые примеры' -n 1 -p 45"

в: test.sh

RUN = myscript.pl
echo `$ RUN $ 1

(должны быть обратные пометки `до $ RUN и после $ 1)

...