2012-02-26 13 views
21

Estoy escribiendo un script que requiere el número de versión bash en un formato corto simple.Cómo obtener el número de versión de bash

yo sepa bash --version, pero esto da una larga salida:

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. 

Esto podría ser reducido al bit que quiero, 4.2.10, por esto:

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

Sin embargo, esto parece que sería propenso a romperse si ese mensaje cambiara ligeramente por alguna razón.

¿Hay alguna manera mejor de hacerlo y cuál es la mejor?

Gracias

Respuesta

23

Si está ejecutando dentro de una cáscara del golpe, entonces la variable de entorno $BASH_VERSION se debe establecer:

$ echo $BASH_VERSION 
4.2.8(1)-release 

Eso debería ser más fácil y más fiable para analizar. Consulte el man page para obtener una lista de las variables de entorno establecidas por el shell.

+2

... y con eso he descubierto '$ BASH_VERSINFO' con la que puedo construirlo usando sólo los bits que necesito, por alguna razón, la página man que está en mi máquina no menciona las variables de entorno que establece. Gracias :) – stwalkerster

3

Parece que hay una variable de entorno para esto:

echo $BASH_VERSION 

produce

4.1.7(1)-release 

en mi máquina.

10

para extraer la primera parte:

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

Solo la versión principal: 'echo $ {BASH_VERSION %% [^ 0-9] *}' –

+3

'echo $ BASH_VERSINFO' –

15

También hay una matriz especial (BASH_VERSINFO) que contiene cada número de versión en elementos separados.

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

Ver http://www.tldp.org/LDP/abs/html/internalvariables.html para más información:

# 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

Sobre la base de bluecat's helpful answer:

Para informar de los 3 primeros componentes de la versión de números - por ejemplo, 4.2.10 - vía built-in array shell variable BASH_VERSINFO:

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

Si llama esto desde lado un script Bash, utilice un subcapa el fin de localizar el efecto de cambiar IFS:

#!/usr/bin/env bash 

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

Explicación:

  • IFS=. fija el separador de campo interno para ., que asegura que cuando imprimimos una matriz dentro de una cadena de comillas dobles más tarde, los elementos de la matriz se unen con ese separador.

    • Tenga en cuenta que no se puede simplemente hacer IFS=. echo ... redefinir transitoriamente IFS como alcance el comando del echo, porque la cáscara parameter expansion (la expansión de ${BASH_VERSINFO[*]: 0:3}, en este caso) ocurre antes de echo se invoca. Por lo tanto, se necesitan dos comandos separados; el uso de un command substitution ($(...)) asegura que el cambio a IFS todavía está localizado, porque las sustituciones de comandos se ejecutan en subcapas.
  • ${BASH_VERSINFO[*]: 0:3} extrae los 3 primeros elementos de variable de matriz $BASH_VERSINFO (comenzando en el índice 0, volver 3 elementos).

    • Nota que para que IFS funcione como se pretende, * en lugar de @ debe ser utilizado para hacer referencia a la matriz; @ sería invariablemente separa los elementos con un solo espacio cada uno, independientemente del valor de $IFS.
1

plazobash --version entonces su salida le gusta

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

o

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

o

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

uso variable de fiesta $BASH_VERSION, ejecute echo $BASH_VERSION, su salida le gusta

4.3.30(1)-release 

Por lo general utilizo comando sed para extraer la versión no, siguiente es comando concreto:

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

por ejemplo:

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

por ejemplo:

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