2012-02-26 48 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] ~]$