Как сохранить одинарные и двойные кавычки в аргументах сценария оболочки БЕЗ возможности контролировать, как они передаются - PullRequest
0 голосов
/ 08 августа 2011

Мне нужно получить аргументы, которые я не могу контролировать в сценарии оболочки, и сохранить любые одинарные или двойные кавычки.Например, скрипт, который просто выводит заданные аргументы, должен действовать следующим образом:

> my_script.sh "double" 'single' none
"double" 'single' none

У меня нет привилегии увеличивать аргументы, такие как:

> my_script.sh \"double\" \'single\' none

или

> my_script.sh '"double"' "'single'" none

И ни "$ @", ни "$ *" не работают.Я также подумал о чтении из STDIN и попробовал что-то вроде:

> echo "double" 'single' none | my_script.sh

, думая, что это может помочь, но пока нет прорыва.

Есть предложения?

CSH / PERLрешения приветствуются.

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Это невозможно (без экранирования), потому что оболочка обрабатывает аргументы и удаляет кавычки перед вызовом вашего скрипта. В результате ваш скрипт не знает о кавычках, указанных в командной строке.

0 голосов
/ 08 августа 2011

Вы не можете восстановить одинарные / двойные кавычки в точности так, как они были, потому что оболочка «съедает» их. Если вам нужно вызвать какой-то другой скрипт из вашего скрипта, вы можете, например, одиночные кавычки аргументы снова. Вот решение PERL, которое я использую:

sub args2shell
{
    local (@argv) = @_;
    local $" = '\' \'';
    local (@margv);

    @margv = map { s/'/'\\''/g; $_ } @argv;
    return "\'@margv\'" if @margv;
    return undef;   
} 

Пример использования:

$args = args2shell @ARGV;
open F, "find -follow $args ! -type d |"; 
...
...