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
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.
s/
, pero ¿qué pasa con\..*
?\.
Simplemente no pude ' entender la segunda.
. Gracias por aclararme esto.