nullglob이 있는 대괄호를 포함하여 bash 변수 내에서 명령을 실행할 수 없습니다.

nullglob이 있는 대괄호를 포함하여 bash 변수 내에서 명령을 실행할 수 없습니다.

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

관련 정보