"configure.ac"의 "case"에 있는 이중 괄호 i[[3456]]86

"configure.ac"의 "case"에 있는 이중 괄호 i[[3456]]86

다음 코드 조각을 이해하려고 노력 중입니다.

host_cpu='i386'

case "$host_cpu" in
   i[[3456]]86)
       echo "host_cpu=i386"
   ;;
   x86_64)
       echo "host_cpu=x86_64"
   ;;
   *)
       echo "AC_MSG_ERROR([unsupported CPU type]) "
   ;;
esac

host_cpu='i386'코드를 테스트하기 위해 변수를 직접 추가했는데 세 번째 경우로 전환되었습니다 echo "AC_MSG_ERROR([unsupported CPU type]) ".

i[[3456]]86)(표시된 것처럼) 이중 괄호를 단일 괄호로 변경하면 i[3456]86)첫 번째 옵션으로 전환되어 i386. 나에게는 이것이 맞는 것 같다.

나는 이것을 이해 [하며 [[이는 테스트 옵션입니다. 스위치 케이스에서는 문자가 출력될 것으로 예상하므로 테스트 조건은 여기에 적용되지 않는 것 같습니다. 그래서 나는 bash가 그것을 테스트 조건으로 취급한다고 가정하고 있으며, 이는 [ a < b ]또는 와 같은 공백으로 구분되어야 합니다 [[ a << b ]]. 이러한 Case 문에는 공백이 없으므로 정규식으로 처리됩니다. 맞습니까?

그래서 내 질문은 코드 작성자가 여기서 대괄호를 사용한 이유는 무엇입니까? 코드를 실행하려고 하면 작동하지 않는데, 그들의 의도는 무엇입니까?

configure.ac참고: 이 코드는 GRUB 소스 코드의 에서 가져왔습니다 .

또한 $host_cpu 및 host_cpu=i386 행은 불필요한 것 같습니다. 작성자가 이렇게 한 이유를 설명해 주시겠습니까?

AC_CANONICAL_HOST

case "$host_cpu" in
    i[[3456]]86) host_cpu=i386 ;;
    x86_64) host_cpu=x86_64 ;;
    *) AC_MSG_ERROR([unsupported CPU type]) ;;
esac

AC_SUBST(host_cpu)
AC_SUBST(host_vendor)

AC_SUBST($host_cpu)를 사용할 생각입니다. 왜 이러지 않니?

답변1

이것이 파일에서 오는 경우 configure.ac순수한 쉘 스크립트는 아니지만 다음을 사용합니다.M4, []따옴표 문자는 어디에 있습니까?:

올바른 인용의 중요성을 완전히 이해하려면 먼저 Autoconf의 특수 문자가 무엇인지 알아야 합니다. ' #'는 매크로 확장이 수행되지 않는 주석을 소개하고, ' ,'는 인수를 구분하고, ' [' 및 ' ]'는 따옴표 자체입니다. (' 및 ' )'(M4는 쌍별 일치를 시도함), 그리고 마지막으로 $매크로 정의 내에서 ' '입니다.

매크로 확장이 가능할 때마다 인용 확장이 있습니다. 즉, 인용 레이어를 벗겨내는 것입니다.

 int tab[10];
 ⇒int tab10;
 [int tab[10];]
 ⇒int tab[10];

이는 [[3456]]autoconf에 의해 로 확장되어야 하며 [3456], 이는 쉘 스크립트로 사용하기 위한 올바른 출력이 됩니다.

관련 정보