2011-08-08 4 views
0

쉘 스크립트로 제어 할 수없는 인수를 받아야하며 작은 따옴표 또는 큰 따옴표를 유지해야합니다.쉘 스크립트 인수에서 작은 따옴표와 큰 따옴표를 유지하는 방법 전달 방법을 제어 할 수없는 경우

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

또는

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

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

나는 같은과 인수를 보강하는 특권이없는 : 예를 들어, 스크립트는 간단하게 다음과 같이 주어진 인수가 행동해야 출력이

"$ @"또는 "$ *"도 작동하지 않습니다. 나는 또한 STDIN에서 독서의 생각과 같은 시도 : 그것은 도움이 될 수 있습니다 생각

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

을,하지만 돌파구 지금까지.

제안 사항?

CSH/PERL 솔루션을 환영합니다.

+0

이 http://stackoverflow.com/questions/3755772/how-to-preserve-double-에 내 대답을 참조 인용 된 인 - 어 - 쉘 스크립트 여기 http://stackoverflow.com/a/26733366/2668213 –

답변

3

쉘이 인수를 처리하고 스크립트가 호출되기 전에 따옴표를 제거하기 때문에 이것은 (이스케이프 처리하지 않고) 불가능합니다. 따라서 스크립트는 명령 행에 지정된 따옴표에 대해 알지 못합니다.

0

작은 따옴표는 쉘에서 '먹기'때문에 정확히 일치하는 부분을 복구 할 수 없습니다. 스크립트에서 다른 스크립트를 호출해야하는 경우 다음과 같이 할 수 있습니다. 단일 인수를 다시 인용하십시오. 여기에 내가 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 |"; 
... 
관련 문제