我正在尝试理解以下代码片段。
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)
,它将切换到第一个选项 yielding i386
。这对我来说似乎是正确的。
我理解这一点,[
并且[[
是测试选项。测试条件似乎不适用于这里,因为切换案例期望输出一个字符。所以我假设 bash 将其作为测试条件,它需要用空格分隔,如[ a < b ]
or [[ a << b ]]
。因为这些 case 语句中没有空格,所以会被当作正则表达式处理。这个对吗?
所以我的问题是为什么代码编写者在这里使用了方括号?当我尝试运行代码时它不起作用,所以他们的意图是什么。
注意:代码取自configure.ac
GRUB 源代码中的 a。
另外 $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)。你为什么不这样做呢?
如果这是来自
configure.ac
文件,那么它不是纯 shell 脚本,而是使用M4 的 Autoconf 脚本,其中[]
是引号字符。:这
[[3456]]
应该由 autoconf 扩展为[3456]
,这将是用作 shell 脚本的正确输出。