Bash 함수는 변수에 정의된 인수를 구문 분석하지 않습니다.

Bash 함수는 변수에 정의된 인수를 구문 분석하지 않습니다.

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 아니요탈출했습니다.

관련 정보