Bash Script para encontrar el número de versión de Debian de / etc / debian_version

A continuación, se muestra lo que estoy usando actualmente para probar la versión de Debian. En lugar de hacerlo de esta manera, ¿puedo hacerlo más sucinto?

#!/bin/bash VERSION=NONE if [ $(cat /etc/debian_version) == '7.3' ]; then VERSION=7 elif [ $(cat /etc/debian_version) == '7.2' ]; then VERSION=7 elif [ $(cat /etc/debian_version) == '7.1' ]; then VERSION=7 elif [ $(cat /etc/debian_version) == '7.0' ]; then VERSION=7 fi 

Sé que no es la forma más atractiva de hacer esto. Lo que quiero es entender cómo usar el file en /etc/debian_version para leer el número de versión antes de . e ignora el número después.

Intenté usar

 if [ $(cat /etc/debian_version) == '7.*' ]; then 

y también intenté

 if [ $(cat /etc/debian_version) == '7.2|7.1|7.0' ]; then 

Pero ninguno de estos funcionó para mí. Quiero probar mi script en el futuro para que, si se lanza Debian 7.4, no tenga que volver sobre todos los scripts que dependen de esto y modificarlos

También estoy al tanto de la lsb_release -a mostrándome la información relativa, simplemente no sé cómo "cortar" lo que quiero de eso y verificar que sea Debian 6 o 7. La secuencia de commands original, como se puede imaginar, es bastante largo.

Cualquier otra publicación a la que me pueda dirigir, también sería apreciada con el uso del método de "cortar" la respuesta para seccionar solo la parte que quiero.

Hay muchas forms de hacer lo que quieres. Este solo elimina el punto decimal y todo lo que sigue después del número de versión:

 VERSION=$(sed 's/\..*//' /etc/debian_version) 

\..* significa un punto ( \. ) seguido de cero o más de cualquier carácter ( .* ). Por lo tanto, para sed , la expresión s/\..*// significa replace el período y todo lo que sigue con nada. El resultado del command sed se guarda en la variable de entorno VERSION .

Lo anterior elimina la necesidad de las declaraciones if / then / elif /…/ fi. Funcionará con bash y ordinario / bin / sh.

MÁS: sed es un editor de flujo: eso significa que lee líneas de stdin, las edita según las instrucciones y (normalmente) las envía a stdout. En este caso, le estamos dando una instrucción "sustituta". Por ejemplo, s/foo/bar/ significa encontrar la primera aparición de foo y replacela por barra. Como un caso especial, s/foo// significa replace foo con nada. En nuestro caso, queremos replace un período seguido de cualquier personaje sin nada. Ahora, un punto es "." excepto que sed normalmente trata un período para significar "cualquier personaje". Entonces, tenemos que "escaping" poniendo una barra invertida delante de ella. Cuando sed ve \. , sabe que nos referimos a un período literal. También queremos borrar cualquier personaje que siga al período. Para representar "cualquier personaje", usamos un punto . (no hay escapatoria). Sin embargo, para ser generales, queremos eliminar todos los caracteres que siguen al período, independientemente de cuántos hay. Entonces, mientras que en el lenguaje de sed , un período significa cualquier carácter, la estrella significa "cualquier número del carácter anterior" (que podría ser cero). Por lo tanto, la estrella de época .* Significa cero o más de cualquier carácter. Entonces, poniéndolo todo junto, s/\..*// le dice a sed que si encuentra un punto, posiblemente seguido de algo, luego lo reemplaza con nada.

Aquí hay una solución que usa bash, sin utilidades externas, y es una sola llamada

 read -d . VERSION < /etc/debian_version 

Esto lee /etc/debian_version , divide la input en el período ( . ), Asigna todo antes del período a VERSION y descarta todo después.


 IFS='.' read VERSION VERSION_MINOR < /etc/debian_version 

Esto es ligeramente diferente ya que guarda todo después del período en VERSION_MINOR


 IFS='.' read -a VERSION < /etc/debian_version 

Este es el más poderoso ya que se divide en el período y lo asigna a la matriz $VERSION . Si la versión es 1.2.3 entonces ${VERSION[0]} == 1 ${VERSION[1]} == 2 y ${VERSION[2]} == 3 .

 case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac 

Esto se puede extender para reconocer más versiones, por supuesto.