매개변수화된 매개변수 이스케이프 관련 문제

매개변수화된 매개변수 이스케이프 관련 문제

제 생각에는진짜제가 매우 분명한 것을 놓치고 있는 것 같아서 이 질문을 하기를 꺼려합니다. 그러나 정확히 동일한 문제가 있는 기존 질문을 찾을 수 없습니다.

편집하면 안 되는 스크립트가 있는데 공백이 포함된 매개변수를 처리하는 데 문제가 있습니다. 나는 문제를 매우 간단하고 재현 가능한 사례로 축소했습니다.

먼저 전달된 명령줄 인수를 출력하는 간단한 스크립트를 만들었습니다.

#!/bin/bash
for i; do
    echo $i
done

그런 다음 명령줄에 전달될 환경 변수를 정의합니다.

MYOPT="With Space"

그러면 이것은 환경에서 변경할 수 없는 부분이므로 변수를 인수로 사용하여 명령을 호출합니다. 불행하게도 이 변수는 우리 환경에서 참조되지 않습니다.

./mycommand.sh $MYOPT

예상한 대로 출력은 다음과 같습니다.

./mycommand.sh $MYOPT
"With
Space"

위 명령에서 변수를 참조하면 작동합니다. 다른 유사한 질문을 살펴보면 이것이 이 문제에 대해 일반적으로 받아 들여지는 해결책인 것 같습니다.

./mycommand.sh "$MYOPT"
"With Space"

그러나 앞서 언급했듯이 이 스크립트가 호출되는 방식을 변경할 수는 없습니다.

아래와 같이 환경 변수에 추가 따옴표를 추가하려고 시도했지만 그것도 도움이 되지 않았습니다.

MYOPT="\"With Space\""
./mycommand.sh $MYOPT
"With
Space"

호출에서 인용하지 않고 스크립트에 전달할 수 있도록 이 환경 변수를 공백으로 정의하는 방법이 있습니까?

관심 있는 분들을 위해 말씀드리자면, 이 문제는 RHEL7 tomcat 환경에서 발생했습니다. JAVA_OPTS는 tomcat.conf에 설정되어 있으며 -Dparamaters="withspaces"가 있습니다. Tomcat과 함께 제공되는 기본 제어 스크립트는 Java를 호출할 때 이러한 JAVA_OPTS를 참조하지 않으므로 이 문제가 발생합니다. 위의 간단한 예로 문제를 축소했습니다.

답변1

할 수 없다반환된 ./mycommand.sh $MYOPT값입니다 MYOPT. 그렇기 때문에 당신은 그것을 할 방법을 찾지 못했습니다. 그것은 불가능합니다. mycommand.sh원래 값을 재구성할 만큼 충분한 정보가 수신되지 않았습니다.

예를 들어 값이 이면 MYOPT현재 디렉터리에 *있는 mycommand.sh파일 이름 목록을 사용하여 호출이 이루어집니다. 목록이 어떻게 구성되었는지 알 수 있는 방법이 없습니다.

값이 MYOPT특정 규칙을 따른다는 것을 알고 있는 경우그러면 다시 재건할 수 있을 것입니다. 이러한 규칙의 간단한 버전은 다음과 같습니다.

  • 값에는 문자 \[*?, 탭 또는 줄바꿈이 포함되지 않습니다.
  • 값은 공백으로 시작하거나 끝나지 않으며, 연속된 공백도 포함하지 않습니다.

이러한 가정 하에서 "$*"in 은 mycommand.sh의 값을 제공합니다 MYOPT. 그러나 이것은 일반적으로 작동하지 않는다는 점을 명심하십시오.

올바른 해결책은 환경을 복구하는 것입니다. 쉘 언어에서는 $MYOPT"취한 값 MYOPT"을 의미하는 것이 아니라 "취한 값"을 의미합니다. MYOPT의 값에 따라 분할하여 IFS각 결과 부분을 와일드카드 패턴으로 처리합니다. 적어도 하나의 파일과 일치하면 와일드카드 패턴은 확대될 예정이다" "값을 얻다"라고 쓰는 방법 MYOPT"$MYOPT", 또는 더 일반적으로 사용합니다$MYOPT 큰따옴표 안에.

관련 정보