nullglob이 켜진 변수 내에 저장된 명령을 실행한다고 가정해 보겠습니다. 예를 들어:
shopt -s nullglob
a="echo [foo]bar"
${a}
물론 이것은 nullglob 옵션으로 인해 빈 출력을 제공하지만 다음 출력을 원합니다(얻을 수 없음).
[foo]bar
나는 \를 사용하여 []를 이스케이프 처리하려고 시도했지만 이것은 나에게만 제공됩니다:
\[foo\]bar
그것을 탈출하는 올바른 방법은 무엇입니까?
편집(일부 맥락을 명확히 하기 위해):
다음과 같은 스크립트가 있습니다.
shopt -s nullglob
for file in tmp/*.pdb; do
base="$(basename ${file} .pdb)"
a="command --option [${base}]foo"
${a}
done
shopt -u nullglob
내가 달성하고 싶은 것은 []를 일반 문자(일치 없음)로 포함하는 옵션을 사용하여 각 파일에 대해 명령을 실행하는 것입니다. 여기서 nullglob은 for 루프에서만 사용됩니다.
즉, "tmp"에 "a.pdb"가 포함된 경우 다음을 실행합니다.
command --option '[a]foo'
해당 파일이 없으면 아무 일도 일어나지 않습니다.
그 동안 for 루프의 첫 번째 명령으로 "shopt -u nullglob"을 이동하는 것이 효과가 있는 것으로 나타났습니다. 그런데 nullglob을 사용해도 []를 어떻게든 탈출할 수 있는지 궁금합니다.
답변1
먼저 읽어보세요명령을 변수에 넣으려고 했지만 복잡한 경우는 항상 실패합니다!.
그런 다음 함수를 정의합니다.
a () {
echo "[foo]bar"
}
스크립트의 경우 처음에는 명령을 변수에 넣을 이유가 없습니다.
shopt -s nullglob
for file in tmp/*.pdb; do
base="$(basename ${file} .pdb)"
command --option "[${base}]foo"
done
shopt -u nullglob
만약 너라면~ 해야 하다변수에 무언가를 저장하고, 명령과 옵션을 분리하고, 배열을 사용하여 옵션을 보관하세요.
shopt -s nullglob
cmd=command
for file in tmp/*.pdb; do
base="$(basename ${file} .pdb)"
options=( --option "[${base}]foo" )
"$cmd" "${options[@]}"
done
shopt -u nullglob
답변2
명령을 변수로 저장하는 이유를 모르겠습니다. 이 문제를 피하기 위해 다음과 같은 작업을 수행해 보는 것은 어떨까요?
shopt -s nullglob
for file in tmp/*.pdb; do
base="$(basename ${file} .pdb)"
command --option "[${base}]foo"
done
shopt -u nullglob
또는 다른 이유로 변수에서 명령을 사용해야 하는 경우 nullglob
명령을 실행하기 전에 명령을 제거하고 파일이 존재하는지 확인할 수 있습니다.
for file in tmp/*.pdb; do
if [ -e "$file" ]; then
base="$(basename ${file} .pdb)"
a="command --option [${base}]foo"
${a}
done
명령을 변수로 저장하는 것은 좋은 생각이 아닙니다. 또 다른 방법은 저장하는 것입니다.옵션변수:
shopt -s nullglob
for file in tmp/*.pdb; do
base="$(basename ${file} .pdb)"
a="--option [${base}]foo"
command "$a"
done
shopt -u nullglob