명령 매개변수의 쉘 문자열 이스케이프

명령 매개변수의 쉘 문자열 이스케이프

다음 명령을 사용하여 "/tmp/pwet/foo bar"를 생성하려고 합니다.

DIR="/tmp/pwet/foo bar"
ARGS="-p ${DIR}"
mkdir $ARGS

통합상의 이유로 ARGS를 두 단계로 빌드해야 했습니다. ARG = some_options + $DIR 이 코드는 /tmp/pwet/foo및 2개의 디렉토리를 생성합니다 ./bar. 이것은 내가 원하는 것이 아닙니다.

나는 많은 탈출을 시도했지만 소용이 없었습니다. bash를 사용하여 스크립트를 실행합니다. 좋은 해결책은 무엇입니까?

답변1

문제는 변수의 내용에 있는 것이 아니라(이것이 가능한 한 많은 이스케이프 문자를 사용하려고 시도할 수 있는 이유입니다) bash를 사용하여 $ARGS변수 내용을 문자 그대로 대체하므로 그 안의 공백은 명령의 실제 공백이 됩니다.

그냥 사용하십시오 mkdir "$ARGS"(즉, 변수 참조를 "s로 묶으십시오)

-p업데이트: 주석에서 논의한 대로 및 기타 옵션이 디렉토리 이름의 일부가 되지 않도록 하려면 2개의 변수를 정의하십시오.

OPTS="-p -whatever"그리고 ARGS="/tmp/pwet/foo bar"

그런 다음 나중에 다음과 같이 mkdir을 발행하십시오.

mkdir $OPTS "$ARGS"

또는 이스케이프 문자를 사용하여 전체 제어권을 갖고 여러 디렉토리를 가질 수 있고 일부는 공백이 있고 일부는 옵션이 없으며 모두 혼합되어 있을 수 있는 경우 전체 명령을 변수에 넣고 bash -c it을 사용하여 실행할 수 있습니다. .

시도해 볼 수 있는 작업의 시작점으로 아래 예를 확인하세요.

MKDIRCMD="mkdir -p \"A B\" \"C D\""
echo $MKDIRCMD # Notice the \ characters are NOT part of the string
bash -c "$MKDIRCMD"

관련 정보