Lo siguiente es lo que estoy usando actualmente para probar la versión de Debian. En lugar de hacerlo de esta manera, ¿puedo hacerlo más conciso?

#!/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 archivo en /etc/debian_version para leer el número de versión antes de . e ignorar el número después.

Intenté usar

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

y también probé

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

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

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 comprobar que sea Debian 6 o 7. El script original, como puedes imaginar , es bastante extenso.

Cualquier otra publicación que me pueda señalar, también sería apreciada si usara el método de «cortar» la respuesta para separar solo la parte que quiero.

Responder

Hay muchas formas de hacer lo que quiere. Este simplemente elimina el punto decimal y todo lo que sigue 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 reemplazar el punto y todo lo que sigue con nada. El resultado del comando sed se guarda en la variable de entorno VERSION.

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

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 buscar la primera aparición de foo y reemplazarla con bar. Como caso especial, s/foo// significa reemplazar foo con nada. En nuestro caso, queremos reemplazar un punto seguido de cualquier carácter por nada. Ahora, un punto es «.» excepto que sed normalmente trata un punto como «cualquier carácter». Por lo tanto, tenemos que «escapar» colocando una barra invertida delante de él. Cuando sed ve \., sabe que nos referimos a un período literal. También queremos borrar los caracteres que siguen al período. Para representar «cualquier carácter», usamos un punto . (sin escape). Sin embargo, para ser generales, queremos eliminar todos los caracteres que siguen al punto, independientemente de cuántos haya. Entonces, mientras que en el idioma de sed «un punto significa cualquier carácter, la estrella significa» cualquier número del carácter anterior «(que podría ser cero). Por lo tanto, punto-estrella .* significa cero o más de cualquier carácter. Entonces, al ponerlo todo junto, s/\..*// le dice a sed que si encuentra un punto, posiblemente seguido de algo, reemplácelo con nada.

Comentarios

  • ¿Se puede elaborar esta respuesta para mí? Entiendo lo que significa la parte s/, pero ¿qué pasa con \..*?
  • @DanijelJ Agregué una explicación. Puede se superponen con lo que ya sabes, pero pensé que era mejor que omitir algo que no ' t. Avísame si te ayuda.
  • Sí, eso me explica mucho. Comprendí la \. Simplemente no pude ' entender la segunda .. Gracias por aclararme esto.

Respuesta

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

read -d . VERSION < /etc/debian_version 

Esto dice /etc/debian_version, divide la entrada en el punto (.), asigna todo antes del período a VERSION y descarta todo lo que sigue.


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

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


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

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

Comentarios

  • ¡Esto es excelente!' ¡nunca he visto que read se use de esta manera!

Responder

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

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *