2012-02-26 12 views
21

Piszę skrypt, który wymaga numeru wersji bash w prostym, krótkim formacie.Jak uzyskać numer wersji bash

Jestem świadomy bash --version, ale daje dużo wyjściowe:

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. 

To może być ścięte do bitu, którego chcę, 4.2.10, przez to:

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

jednak wydaje się, że byłoby podatne na zerwanie, gdyby ta wiadomość zmieniła się nieznacznie z jakiegokolwiek powodu.

Czy istnieje lepszy sposób na zrobienie tego, a jaki jest lepszy sposób?

Dzięki

Odpowiedz

23

Jeśli używasz w powłoce bash, wtedy zmienna $BASH_VERSION środowiska powinny być ustawione:

$ echo $BASH_VERSION 
4.2.8(1)-release 

To powinno być łatwiejsze i bardziej wiarygodne, aby zanalizować. Zobacz man page listę zmiennych środowiskowych ustawionych przez powłokę.

+2

... i że odkryłem '$ BASH_VERSINFO' z których można budować go używając tylko bity muszę, z jakiegoś powodu strona podręcznika na moim komputerze nie ma żadnej wzmianki o zmiennych środowiskowych, które ustawia. Dzięki :) – stwalkerster

3

Wydaje się, że zmienna środowiskowa dla tego:

echo $BASH_VERSION 

daje

4.1.7(1)-release 

na moim komputerze.

10

Aby wyodrębnić pierwszej części

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

Tylko główna wersja: 'echo $ {BASH_VERSION %% [^ 0-9] *}' –

+3

'echo $ BASH_VERSINFO' –

15

Jest także specjalna matryca (BASH_VERSINFO) zawierający co numer wersji oddzielnych elementów.

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

Zobacz http://www.tldp.org/LDP/abs/html/internalvariables.html o więcej informacji:

# 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

Opierając się na bluecat's helpful answer:

Aby zgłosić pierwsze 3 wersja numer składniki - np 4.2.10 - via built-in array shell variable BASH_VERSINFO:

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

Jeśli dzwonisz to z strona skrypt Bash, użyj powłoki w tle w celu zlokalizowania efekt zmiany IFS:

#!/usr/bin/env bash 

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

Objaśnienie:

  • IFS=. ustawia wewnętrzny separator pól do ., który zapewnia, że kiedy później drukujemy tablicę wewnątrz podwójnie cytowanego ciągu, elementy tablicy są łączone z tym separatorem.

    • Należy pamiętać, że nie można po prostu zrobić IFS=. echo ... przejściowo przedefiniować IFS zawężona do poleceniu echo, ponieważ powłoka parameter expansion (ekspansja ${BASH_VERSINFO[*]: 0:3}, w tym przypadku) dzieje przedecho jest wywoływany. Dlatego potrzebne są dwa oddzielne polecenia; użycie command substitution ($(...)) zapewnia, że ​​zmiana na IFS jest nadal zlokalizowana, ponieważ podstawienia komend działają w podpowłokach.
  • ${BASH_VERSINFO[*]: 0:3} wyodrębnia się pierwsze elementy 3 z tablicy zmiennej $BASH_VERSINFO (rozpoczynając od indeksu 0 powrócić 3 elementów).

    • Należy zauważyć, że w celu IFS działała zgodnie z przeznaczeniem, * zamiast @ musi być użyta w odniesieniu do tablicy; @ będzie niezmiennie oddzielić elementy za jednym razem, niezależnie od wartości $IFS.
1

runbash --version następnie jego wyjście lubi

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

lub

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

lub

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

użycie bash zmienna $BASH_VERSION uruchom echo $BASH_VERSION, jego wyjście lubi

4.3.30(1)-release 

Zazwyczaj używam polecenia sed wyodrębnić wersji nie po to beton polecenie:

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

np

[[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]'

np

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