스크립트의 매개변수를 올바르게 구문 분석할 수 없습니다. 이 시나리오는 아래에 설명되어 있습니다.
첫 번째 스크립트(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
.