2012-02-26 77 views
21

我正在编写一个脚本,它需要简单短格式的bash版本号。如何获得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. 

这可以被砍倒在一点我想,4.2.10,本:

bash --version | grep "bash" | cut -f 4 -d " " | cut -d "-" -f 1 | cut -d "(" -f 1 

然而,如果这个消息由于某种原因而稍微改变,这感觉就像是容易中断。

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

感谢

回答

23

如果你是bash shell中运行,那么$BASH_VERSION环境变量应设置:

$ echo $BASH_VERSION 
4.2.8(1)-release 

这应该是更容易和更可靠的解析。请参阅man page以获取由shell设置的环境变量列表。

+2

......并与我发现'$ BASH_VERSINFO'与我可以只用我所需要的比特构建它,出于某种原因,我的机器上的手册页没有提及它设置的环境变量。谢谢:) – stwalkerster 2012-02-26 05:10:21

3

似乎是这个环境变量:

echo $BASH_VERSION 

产生

4.1.7(1)-release 

我的机器上。

10

要提取的第一部分:

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

只是主要版本:'echo $ {BASH_VERSION %% [^ 0-9] *}' – 2014-03-20 19:47:19

+3

'echo $ BASH_VERSINFO' – 2015-08-01 19:43:33

15

还有含在分开的元件每一个版本号的特殊阵列(BASH_VERSINFO)。

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

更多信息,请参见http://www.tldp.org/LDP/abs/html/internalvariables.html

# Bash version info: 

for n in 0 1 2 3 4 5 
do 
    echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}" 
done 

# BASH_VERSINFO[0] = 3      # Major version no. 
# BASH_VERSINFO[1] = 00      # Minor version no. 
# BASH_VERSINFO[2] = 14      # Patch level. 
# BASH_VERSINFO[3] = 1      # Build version. 
# BASH_VERSINFO[4] = release    # Release status. 
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # Architecture 
              # (same as $MACHTYPE). 
0

大厦bluecat's helpful answer

要报告前3个版本号的组件 - 例如,4.2.10 - 通过built-in array shell variable BASH_VERSINFO

$ bash -c 'IFS=.; echo "${BASH_VERSINFO[*]: 0:3}"' 
4.2.10 

如果你是从侧的bash脚本,使用子外壳以便定位改变IFS的效果:

#!/usr/bin/env bash 

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

说明:

  • IFS=.设置内部字段分隔符.,这确保了当我们稍后在双引号字符串内打印数组时,数组的元素与该分隔符连接。

    • 请注意,你不能只是做IFS=. echo ...瞬时重新定义IFS范围限定为在echo命令,因为外壳parameter expansion(扩大${BASH_VERSINFO[*]: 0:3},在这种情况下)发生被调用之前echo。因此,需要两个单独的命令;使用command substitution$(...))确保对IFS的更改仍然是本地化的,因为命令替换在子壳中运行。
  • ${BASH_VERSINFO[*]: 0:3}提取从数组变量$BASH_VERSINFO第一3个元素(从索引0,返回3元素)。

    • 注意,为了使IFS工作按预期运行,*而非@必须用于引用数组; @总是每个单独的空间分隔元素,不管$IFS的值。
1

运行bash --version然后其输出喜欢

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

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

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

使用 bash的变量$BASH_VERSION,运行echo $BASH_VERSION,其输出喜欢

4.3.30(1)-release 

通常我用命令sed提取版本号,以下是具体的命令:

bash --version | sed -r -n '[email protected]*version (.*)\(1\)-release.*@\[email protected]'

如:

[[email protected] ~]$ bash --version | sed -r -n '[email protected]*version (.*)\(1\)-release.*@\[email protected]' 
4.2.46 
[[email protected] ~]$ 

echo $BASH_VERSION | sed -r -n '[email protected](.*)\(1\)-release.*@\[email protected]'

如:

[[email protected] ~]$ echo $BASH_VERSION | sed -r -n '[email protected](.*)\(1\)-release.*@\[email protected]' 
4.2.46 
[[email protected] ~]$