Próbuję zrozumieć następujący fragment kodu.
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
Sam dodałem zmienną, host_cpu='i386'
aby przetestować kod, i zmieniłem ją na trzeci przypadek echo "AC_MSG_ERROR([unsupported CPU type]) "
.
Jeśli zmienię podwójny nawias klamrowy i[[3456]]86)
na pojedynczy nawias klamrowy jak w i[3456]86)
, przełącza się on na pierwszą opcję, dając i386
. Wydaje mi się to poprawne.
Rozumiem to [
i [[
są to opcje testowe. Wydaje się, że warunek testowy nie ma tutaj zastosowania, ponieważ przypadki przełączników oczekują, że zostanie wyświetlony znak. Zakładam więc, że bash odbierze go jako warunek testowy, musi być oddzielony spacją jak w [ a < b ]
lub [[ a << b ]]
. Ponieważ w tej instrukcji przypadku nie ma spacji, będzie traktowane jako wyrażenie regularne. Czy to jest poprawne?
Moje pytanie brzmi więc, dlaczego autor kodu użył podwójnego nawiasu kwadratowego? Nie działało, gdy próbowałem uruchomić kod, więc jaki był ich zamiar.
Uwaga: kod pochodzi z configure.ac
kodu źródłowego GRUB.
Także linie $ host_cpu i host_cpu = i386 wydają się niepotrzebne, czy możesz wyjaśnić, dlaczego pisarz zrobiłby to:
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)
Myślę o użyciu AC_SUBST ($ host_cpu). Dlaczego nie zrobiłbyś tego w ten sposób?
Odpowiedzi:
Jeśli pochodzi z
configure.ac
pliku, to nie jest to czysty skrypt powłoki, ale skrypt Autoconf używający M4, w którym[]
występują znaki cudzysłowu. :Że
[[3456]]
powinien zostać rozszerzony przez autoconf do[3456]
, co byłoby poprawne wyjście do wykorzystania jako skrypt powłoki.źródło
AC_INIT([foo])
do góry fragmentuautoconf snippet
[ ]
się, że są ustawione jako znaki cytowania w skryptach autoconf. Domyślne znaki cytowania w M4 to`'
, jak widzieliście.