중첩된 매개변수 구문 분석

중첩된 매개변수 구문 분석

스크립트의 매개변수를 올바르게 구문 분석할 수 없습니다. 이 시나리오는 아래에 설명되어 있습니다.

첫 번째 스크립트(test2.sh):

#! /bin/sh
arg_part1="./test1.sh '123 789'"
arg_part2=456

#Option 1
${arg_part1} ${arg_part2} 

#Option 2
$("$arg_part1" arg_part2)

두 번째 스크립트(test1.sh):

#! /bin/sh
echo "Hello World $1 $2"

산출:

Hello World '123 789'
./test1.sh '123 789': No such file or directory

원하는 출력:

Hello World 123 789 456

"123 789"는 첫 번째 매개변수로 처리되어야 하고 456은 두 번째 매개변수로 처리되어야 합니다.노트:arg_part1을 두 개의 다른 변수로 나누는 옵션이 없습니다.

답변1

${arg_part1}계속해서 Split+glob 연산자(따옴표가 없는 sums ) 를 사용할 수 있지만 ${arg_part2}분할 부분에는 다른 구분 기호를 사용할 수 있습니다(일부 요소에는 기본 구분 기호(공백) 중 하나가 포함되어 있기 때문입니다). 또한 glob 부분을 비활성화하려고 합니다.

#! /bin/sh -
arg_part1='./test1.sh|123 789'
arg_part2=456

IFS='|'  # split unquoted expansions on | instead of default SPC+TAB+NL
set -o noglob # disable the glob part (not that it would have any effect
              # in this particular case).

$arg_part1 $arg_part2 # invoke split+glob

# or since you're not intending to split $arg_part2
$arg_part1 "$arg_part2"

코드를 저장하려면 변수보다 함수가 더 적합한 경우가 많습니다.

arg_part1() { ./test1.sh '123 789' "$@"; }
arg_part2=456

arg_part1 "$arg_part2"

그리고 분할+글로브 연산자를 망칠 필요도 없고, 위험한 eval.

답변2

eval나는 당신이 "고착" 되어 arg_part1이 명령 문자열로 재 해석 된 다음 명령과 인수로 구문 분석되도록 여기를 사용해야한다고 생각합니다 .

#! /bin/sh
arg_part1="./test1.sh '123 789'"
arg_part2=456
eval "${arg_part1}" "${arg_part2}"

산출:

Hello World 123 789 456

디버그 출력:

$ sh -x test2.sh
+ arg_part1='./test1.sh '\''123 789'\'''
+ arg_part2=456
+ eval './test1.sh '\''123 789'\''' 456
++ ./test1.sh '123 789' 456
Hello World 123 789 456

내부적으로 참조했기 때문에 '123 789'test1.sh에 대한 단일 인수로 나타납니다 $1.

관련 정보