如何检测 Bash >=4.0?

Jak*_*obb 6 bash version

我正在编写一个使用 的脚本read -i,因此它需要 Bash 4.0 或更新版本。

不幸的是,到 2020 年初,macOS 仍然附带 Bash 3.x,我的脚本的许多用户将使用 Mac。由于 Apple 已将默认 shell 更改为 zsh,因此我不希望他们更新捆绑版本。

因此,我希望我的脚本能够检测 Bash 是否足够新,然后退出并返回一条指导用户升级的有用错误消息。

我知道我可以比较${BASH_VERSION},但这是一个非数字格式的字符串,可能不可靠。对此做出假设感觉很脆弱。

实现这一目标的最佳方法是什么?

requireBash4() {
  if <something here>; then
    >&2 echo "Bash 4.0 or newer is required."
    >&2 echo "Once you're upgraded, re-run this script."
    exit 1
  fi
}
Run Code Online (Sandbox Code Playgroud)

mos*_*svy 15

if ((BASH_VERSINFO >= 4)); then ...
Run Code Online (Sandbox Code Playgroud)

请注意,这BASH_VERSINFO是一个数组。与 bash 中的任何数组一样,将它用作普通变量是指它的第 0 个元素。((BASH_VERSINFO[0] >= 4))如果您觉得更清楚,您也可以使用。

是的,至少从 bash 2.0 开始就支持这个变量和语法。

BASH_VERSINFO

一个只读数组变量,其成员保存此 bash 实例的版本信息。分配给数组成员的值如下:

BASH_VERSINFO[0] 主要版本号(发行版)。
BASH_VERSINFO[1] 次要版本号(版本)。
BASH_VERSINFO[2] 补丁级别。
BASH_VERSINFO[3] 构建版本。
BASH_VERSINFO[4] 发布状态(例如,beta1)。
BASH_VERSINFO[5] 的值MACHTYPE

  • 另外,鉴于问题中的示例代码,它应该是`&lt; 4`,而不是`&gt;= 4`。:) (4认同)