gcc를 호출하려면 간단한 스크립트가 필요하지만 경로에 공백이 있는 디렉터리에 전달해야 하는 라이브러리 목록이 많습니다.
내 스크립트를 테스트하기 위해 gcc 대신 다음 명령을 사용합니다.
#!/bin/bash
for var in "$@"
do
echo "$var"
done
내가 시도한 수많은 시도 중 하나는 다음과 같습니다.
#!/bin/bash
LIBDIR="lib dir"
LIBS=
LIBS+="lib1 "
LIBS+="lib2 "
CMD="./debug.sh "
for LIB in $LIBS
do
CMD+="-I ${LIBDIR}/${LIB} "
done
${CMD}
exit
분명히 문제는 bash가 인수를 구분하는 데 사용되는 공백과 그렇지 않은 공백을 구별할 수 없다는 것입니다. 그러나 따옴표나 백슬래시를 어떻게 배치하더라도 일부 공백을 "인용"하고 다른 공백은 "인용"하는 방법을 알 수 없습니다.
답변1
특정 사례의 경우:
#!/bin/bash
LIBDIR="lib dir"
LIBS=("lib1" "lib2")
CMD=(./debug.sh)
for LIB in "${LIBS[@]}"
do
CMD+=(-I "${LIBDIR}/${LIB}")
done
"${CMD[@]}"
exit
LIBS
두 개의 배열, 즉 라이브러리 이름과 CMD
명령 자체가 사용됩니다 . 이 방법은 다음과 같은 경우에도 작동합니다.다른여분의 공간. +=(...)
새 문자열을 문자열 끝에 연결하는 것처럼 새 항목을 배열 끝에 연결합니다. "${CMD[@]}"
배열의 모든 값으로 확장됩니다.별도의 단어로(공백으로 구분하지 않음)공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?이 주제에 대한 일반적인 내용이 더 많이 있습니다.변수에 저장된 명령을 어떻게 실행할 수 있나요?구체적으로.