Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Bash版本号_Bash_Shell - Fatal编程技术网

如何获取Bash版本号

如何获取Bash版本号,bash,shell,Bash,Shell,我正在编写一个脚本,它需要一个简单的简短格式的Bash版本号 我知道bash--version,但这会给出很长的输出: GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

我正在编写一个脚本,它需要一个简单的简短格式的Bash版本号

我知道
bash--version
,但这会给出很长的输出:

GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
然而,无论出于何种原因,如果信息发生微小的变化,这感觉很容易中断


有没有更好的方法来做到这一点,这是什么更好的方法?

似乎有一个环境变量:

echo $BASH_VERSION
屈服

4.1.7(1)-release

在我的机器上。

如果在Bash shell中运行,则应设置
$Bash\u VERSION
环境变量:

$ echo $BASH_VERSION
4.2.8(1)-release

这应该更容易、更可靠地解析。有关shell设置的环境变量列表,请参见。要提取第一部分,请执行以下操作:

$ echo ${BASH_VERSION%%[^0-9.]*}
4.2.10

还有一个特殊的数组(BASH_VERSINFO),在单独的元素中包含每个版本号

if ((BASH_VERSINFO[0] < 3))
then
  echo "Sorry, you need at least bash-3.0 to run this script."
  exit 1
fi
基于:

要报告前3个版本号组件,例如,
4.2.10
,请通过:

如果从Bash脚本内部调用此函数,请使用子shell来本地化更改
IFS
的效果:

#!/usr/bin/env bash

ver=$(IFS=.; echo "${BASH_VERSINFO[*]: 0:3}")  # -> e.g., $ver == '4.2.10'
说明:

  • IFS=。
    将内部字段分隔符设置为
    ,这样可以确保以后在双引号字符串中打印数组时,数组的元素与该分隔符连接

    • 请注意,您不能只执行
      IFS=。echo…
      暂时重新定义作用域为
      echo
      命令的IFS,因为shell(在本例中,
      ${BASH_VERSINFO[*]:0:3}
      的扩展)发生在调用
      echo
      之前。因此,需要两个独立的命令;使用(
      $(…)
      )可以确保对
      IFS
      的更改仍然是本地化的,因为命令替换在子shell中运行
  • ${BASH_VERSINFO[*]:0:3}
    从数组变量
    $BASH_VERSINFO
    中提取前3个元素(从索引
    0
    开始,返回
    3
    元素)

    • 请注意,为了使
      IFS
      按预期工作,必须使用
      *
      而不是
      @
      来引用数组
      @
      将始终使用单个空格分隔元素,而不考虑
      $IFS
      的值

运行
bash--version
,然后其输出如下所示:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
4.3.30(1)-release


使用Bash变量
$Bash\u版本
并运行
echo$Bash\u版本
。其输出如下:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
4.3.30(1)-release

通常我使用命令
sed
提取版本号,具体命令如下:

bash --version | sed -r -n 's@.*version (.*)\(1\)-release.*@\1@p'
例如:

[flying@lempstacker ~]$ bash --version | sed -r -n 's@.*version (.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
例如:

[flying@lempstacker ~]$ bash --version | sed -r -n 's@.*version (.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
在此基础上构建了一个函数,该函数只检查主版本或主版本和次版本的组合,如果当前Bash版本>=所需版本,则返回0:

check_bash_version() {
    local major=${1:-4}
    local minor=$2
    local rc=0
    local num_re='^[0-9]+$'

    if [[ ! $major =~ $num_re ]] || [[ $minor && ! $minor =~ $num_re ]]; then
        printf '%s\n' "ERROR: version numbers should be numeric"
        return 1
    fi
    if [[ $minor ]]; then
        local bv=${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}
        local vstring=$major.$minor
        local vnum=$major$minor
    else
        local bv=${BASH_VERSINFO[0]}
        local vstring=$major
        local vnum=$major
    fi
    ((bv < vnum)) && {
        printf '%s\n' "ERROR: Need Bash version $vstring or above, your version is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}"
        rc=1
    }
    return $rc
}

请参阅与此相关的断言:


这是对BASH_VERSINFO的其他响应的一种变体:

检查\u bash\u版本()
{
本地a=4 b=3#Bash版本>=a.b
((BASH_VERSINFO[0]>a | |\
(BASH_VERSINFO[0]==a&&BASH_VERSINFO[1]>=b))|{
echo“错误:Bash版本>=$a.$b应为。”>&2
返回1
}
}
检查|bash|u版本|退出1

。。。有了它,我发现了
$BASH_VERSINFO
,我可以只用我需要的位来构建它,出于某种原因,我的机器上的手册页没有提到它设置的环境变量。谢谢:)只是主要版本:
echo${BASH_version%%[^0-9]*}
echo$BASH_VERSINFO
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
check_bash_version() {
    local major=${1:-4}
    local minor=$2
    local rc=0
    local num_re='^[0-9]+$'

    if [[ ! $major =~ $num_re ]] || [[ $minor && ! $minor =~ $num_re ]]; then
        printf '%s\n' "ERROR: version numbers should be numeric"
        return 1
    fi
    if [[ $minor ]]; then
        local bv=${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}
        local vstring=$major.$minor
        local vnum=$major$minor
    else
        local bv=${BASH_VERSINFO[0]}
        local vstring=$major
        local vnum=$major
    fi
    ((bv < vnum)) && {
        printf '%s\n' "ERROR: Need Bash version $vstring or above, your version is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}"
        rc=1
    }
    return $rc
}
check_bash_version 4   # Check if 4.0 or above
check_bash_version 4 2 # Check if 4.2 or above