Это уже несколько часов сводит меня с ума.
Рассмотрим следующий тестовый скрипт в 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 из командной строки во второй раз, на этот раз он не хочет видеть яблочный пирог в качестве единственного аргумента.
Почему бы и нет?