Bash 스크립트에서 이상한 동작이 발생했습니다.
parser.sh
나는 매우 간단한 간단한 스크립트를 가지고 있습니다 .
#!/bin/bash
for arg in "$@"
do
echo ARGUMENT: "$arg"
done
이 스크립트는 동일한 디렉터리의 다른 스크립트에서 호출됩니다. 이 스크립트를 호출하겠습니다.test.sh
#!/bin/bash
`pwd`/parser.sh "ARG1=FIRST" "ARG2=TESTING SPACES"
위에 표시된 스크립트는 작동하고 예상대로 매개변수를 출력합니다.
ARGUMENT: ARG1=FIRST
ARGUMENT: ARG2=TESTING SPACES
test.sh
그러나 다음과 같이 변경하면 :
#!/bin/bash
ARGS="\"ARG1=FIRST\" \"ARG2=TESTING SPACES\""
`pwd`/parser.sh $ARGS
이 간단한 수정으로 인해 매개변수를 반복할 때 코드가 실패하게 됩니다.
ARGUMENT: "ARG1=FIRST"
ARGUMENT: "ARG2=TESTING
ARGUMENT: SPACES"
왜 이런 일이 발생합니까? 내가 무엇을 놓치고 있나요?
미리 감사드립니다
답변1
일반 변수에 매개변수를 저장하지 말고 배열을 사용하세요.
args=( "ARG1=FIRST" "ARG2=TESTING SPACES" )
./parser.sh "${args[@]}"
따옴표는 이스케이프 처리되어 문자 그대로 처리되며 변수는 따옴표 없이 확장되므로 단어 분리의 영향을 받습니다.
pwd
또한 이런 방식으로 사용할 필요는 없으며 .
현재 디렉터리를 참조하는 데 사용할 수 있습니다.
다음을 통해 변수가 어떻게 처리되는지 확인할 수 있습니다.
$ ARGS="\"ARG1=FIRST\" \"ARG2=TESTING SPACES\""
$ printf '%q\n' $ARGS
\"ARG1=FIRST\"
\"ARG2=TESTING
SPACES\"
보시다시피 큰따옴표는 의도한 바가 아닌 이스케이프를 위해 확장되고 있으며 TESTING
그 사이의 공백은SPACES
아니요탈출했습니다.