다음 코드 조각을 이해하려고 노력 중입니다.
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]
, 이는 쉘 스크립트로 사용하기 위한 올바른 출력이 됩니다.