![명령 매개변수의 쉘 문자열 이스케이프](https://linux55.com/image/58839/%EB%AA%85%EB%A0%B9%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%9D%98%20%EC%89%98%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84.png)
다음 명령을 사용하여 "/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"