2011-09-16 3 views
0

나는 호출 된 다른 스크립트로 인용 된 값을 가진 posix 스타일 인수를 전달하려고하는 bash 스크립트를 가지고 있습니다. 명령 줄에 내가 입력 할 수 있습니다 : 이것은 인수가 키 foo을 갖는 의미인용 부호가있는 Posix 인수 값을 bash로 전달

somescript --foo="bar baz" 

, 값은 bar baz입니다. somescript 내에서이 작업 것이라고 생각 될 수 있습니다

innerscript "[email protected]" 

그러나이 각 인수의 전체을 재-인용, 키와 값 모두가 아니라 값 함께 청크. 따라서 innerscript는 "--foo=bar baz"을 받고 값이foo=bar baz 키를 전달하려고한다고 생각합니다.

bash에게 전달 된 모든 인수를 다시 인용하도록 말하는 것은 충분하지 않습니다. 나는 bash에게 "의 인자가 정확히 어떻게 인용되었는지 다시 말해서"이라고 전했다. 내 따옴표의 위치를 ​​변경하지 마라.

답변

3

문제는 innerscript입니다. 사이에는 차이가 없습니다 :

innerscript --foo="bar baz" 
innerscript "--foo=bar baz" 
innerscript --foo=bar\ baz 
innerscript --foo=bar' 'baz 

하거나, 의심 할 여지없이, 다른 대안의 수. innerscript 안에 $1 (셸 표기법으로 표시)에는 --foo=bar baz의 13 자만 포함됩니다. 덧붙여 말하자면, somescript에 대해서도 마찬가지입니다. 위와 같이 호출하면 큰 따옴표가 표시되지 않습니다. 그것들은 쉘에 의해 처리된다. 구문 분석 인수 및 옵션의

echo --foo="bar baz" 
+0

POSIX, GNU 스타일입니다. 당신이 옳았. 그것은 내가 생각한 것처럼 완전히 독립적 인 옵션을 가지고 있지 않았습니다. –

1

당신은 그렇게 할 수 없습니다.

스크립트는 인수를받습니다. 쉘이 그 라인을으로 파싱하면 첫 번째 인수는 "--foo = bar baz"로 전달됩니다. 너는 그 일을 막기 위해 아무것도 할 수 없다. 그러나 나는 그 문제를 야기하는 이유를 알지 못한다. 당신은 =에 기반하여 논쟁을 나눌 수있다.

# function test { echo $1; } 
# test a"b""c"'d'\e 
abcde 
0

getopt 명령을 사용

노력이를 참조하십시오.

주 1 : getopt (gnu 명령)은 (POSIX에 정의 된) getopts입니다.

주 2 : --long-options하지 문제는 innerscript의 나의 이해했다

+0

[bash 스크립트에서 getopts를 사용하여 길고 짧은 명령 행 옵션 얻기] (http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and- 짧은 명령 행 옵션/402413 # 402413). –