Обрабатывать аргументы командной строки Perl с пробелами из скрипта bash? - PullRequest
5 голосов
/ 04 марта 2011

Это уже несколько часов сводит меня с ума.

Рассмотрим следующий тестовый скрипт в perl: (Hello.pl)

#!/usr/bin/perl
print "----------------------------------\n";
$numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments:\n";

foreach $argnum (0 .. $#ARGV) {
    print "$ARGV[$argnum]\n";
}

Хорошо, он просто выводит аргументы командной строки, переданные сценарию.

Например:

$ ./hello.pl apple pie
----------------------------------
thanks, you gave me 2 command-line arguments:
apple
pie

Я могу дать сценарию один аргумент с пробелом, заключив слова в двойные кавычки:

$ ./hello.pl "apple pie"
----------------------------------
thanks, you gave me 1 command-line arguments:
apple pie

Теперь я хочу использовать этот сценарий в сценарии оболочки. Я установил скрипт оболочки так:

#!/bin/bash

PARAM="apple pie"
COMMAND="./hello.pl \"$PARAM\""

echo "(command is $COMMAND)"
$COMMAND

Я звоню в hello.pl с теми же параметрами и экранированными кавычками. Этот скрипт возвращает:

$ ./test.sh 
(command is ./hello.pl "apple pie")
----------------------------------
thanks, you gave me 2 command-line arguments:
"apple
pie"

Несмотря на то, что переменная $ COMMAND отображает команду точно так же, как я запускал сценарий perl из командной строки во второй раз, на этот раз он не хочет видеть яблочный пирог в качестве единственного аргумента.

Почему бы и нет?

Ответы [ 3 ]

6 голосов
/ 04 марта 2011

Это похоже на проблему, описанную в FAQ по Bash: Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!

Ответ на этот вопросFAQ предлагает ряд возможных решений - я надеюсь, что это полезно.

2 голосов
/ 04 марта 2011

Вопрос о 2 аргументах командной строки

"apple
pie"

происходит из-за расширения оболочки с переменной оболочки IFS, для которой в качестве значения задан пробел.

printf '%q\n' "$IFS"   # show value of IFS variable

Вы можете использовать xargs & sh -c '... code ...' для имитации / повторного включения обычного анализа параметров.

PARAM="'apple pie'"
printf '%s' "$PARAM" | xargs sh -c './hello.pl "$@"' argv0

Другим вариантом может быть написание нескольких строк C (как в shebang.c)!

http://www.semicomplete.com/blog/geekery/shebang-fix.html

0 голосов
/ 04 марта 2011

Вы должны попробовать eval $COMMAND вместо простого $COMMAND.

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