Bash Script para localizar o número da versão Debian de / etc / debian_version

3

O seguinte é o que eu estou usando atualmente para testar a versão do Debian. Em vez de fazê-lo desta maneira, posso torná-lo mais 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

Eu sei que não é a maneira mais atraente de fazer isso. O que eu quero, é entender como usar o arquivo em /etc/debian_version para ler o número da versão antes do . e ignorar o número depois.

Eu tentei usar

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

e também tentei

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

Mas nenhum desses funcionou para mim. Eu quero revisar meu script no futuro para que, se o Debian 7.4 for lançado, não tenha que voltar atrás em todos os scripts que dependem disso e alterá-los

Eu também estou ciente do lsb_release -a mostrando-me a informação relativa, eu simplesmente não sei como "cortar" o que eu quero disso e verificar se ele é o Debian 6 ou 7. O script original, como você pode imaginar, é bastante demorado.

Quaisquer outras mensagens para as quais você possa me apontar, também serão apreciadas usando o método de "cortar" a resposta para apenas separar a parte que eu quero.

    
por Danijel-James W 19.01.2014 / 03:19

3 respostas

6

Existem várias maneiras de fazer o que você deseja. Este apenas remove o ponto decimal e tudo depois do número da versão:

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

\..* significa um período ( \. ) seguido por zero ou mais de qualquer caractere ( .* ). Assim, para sed , a expressão s/\..*// significa substituir o período e tudo o que se segue com nada. O resultado do comando sed é salvo na variável de ambiente VERSION .

O acima elimina a necessidade das declarações if / then / elif /.../ fi. Ele funcionará com o bash e o ordinário / bin / sh.

MORE: sed é um editor de fluxo: isso significa que ele lê linhas de stdin, edita-as conforme as instruções e (normalmente) as envia para stdout. Neste caso, estamos dando uma instrução "substituta". Por exemplo, s/foo/bar/ significa localizar a primeira ocorrência de foo e substituí-la por bar. Como um caso especial, s/foo// significa substituir foo por nada. No nosso caso, queremos substituir um período seguido por qualquer caractere com nada. Agora, um período é "." exceto que sed normalmente trata um período para significar "qualquer caractere". Então, precisamos "escapar" colocando uma barra invertida à frente. Quando sed\. , sabe que nos referimos a um período literal. Também queremos apagar todos os caracteres após o período. Para representar "qualquer personagem", usamos um período . (sem escape). Para ser geral, no entanto, queremos excluir todos os caracteres após o período, independentemente de quantos existem. Então, enquanto na linguagem sed , um período significa qualquer caractere, a estrela significa "qualquer número do caractere precedente" (que pode ser zero). Assim, a estrela do período .* significa zero ou mais de qualquer caractere. Então, colocando tudo junto, s/\..*// diz a sed que, se encontrar um período, possivelmente seguido por qualquer coisa, substitua-o por nada.

    
por 19.01.2014 / 03:26
7

Aqui está uma solução que usa o bash, sem utilitários externos, e é uma única chamada

read -d . VERSION < /etc/debian_version

/etc/debian_version , divide a entrada no período ( . ), atribui tudo antes do período para VERSION e descarta tudo depois.

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

Isso é um pouco diferente, pois salva tudo após o período em VERSION_MINOR

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

Este é o mais poderoso que divide no período e atribui ao array $VERSION . Se a versão for 1.2.3 , então ${VERSION[0]} == 1 ${VERSION[1]} == 2 e ${VERSION[2]} == 3 .

    
por 19.01.2014 / 05:01
2
case 'cat /etc/debian_version' in
7*) VERSION=7;;
*) VERSION=NONE;;
esac

Isso pode ser estendido para reconhecer mais versões, é claro.

    
por 28.07.2015 / 01:54