O seguinte é o que estou usando atualmente para testar a versão do Debian. Em vez de fazer dessa forma, 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 

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 de . e ignorar o número depois.

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 preparar meu script para o futuro, para que se o Debian 7.4 for lançado, eu não tenha que voltar a todos os scripts que dependem disso e alterá-los

Também estou ciente do lsb_release -a me mostrando as informações relativas, só não sei como “cortar” o que quero disso e verificar se é o Debian 6 ou 7. O script original, como você pode imaginar , é bastante extenso.

Quaisquer outras postagens que você possa apontar, também seriam apreciadas com o uso do método de “cortar” a resposta para separar apenas a parte que desejo.

Resposta

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

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

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

O acima elimina a necessidade do if / then / elif /…/ fi declarações. Ele funcionará com bash e / bin / sh comum.

MAIS: sed é um editor de fluxo: isso significa que ele lê as linhas de stdin, as edita de acordo com as instruções e (normalmente) as envia para stdout. Nesse caso, estamos dando a ele uma instrução “substituta”. Por exemplo, s/foo/bar/ significa encontrar 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 ponto seguido por qualquer caractere por nada. Agora, um ponto final é “.” exceto que sed normalmente trata um ponto como “qualquer caractere”. Portanto, precisamos “escapar” colocando uma barra invertida antes dele. Quando sed\., sabe que queremos dizer um período literal. Também queremos apagar todos os caracteres após o ponto. Para representar “qualquer caractere”, usamos um ponto final . (sem escape). Para ser geral, porém, queremos excluir todos os caracteres após o ponto, independentemente de quantos sejam. Portanto, enquanto no idioma de sed “, um ponto significa qualquer caractere, a estrela significa” qualquer número do caractere anterior “(que pode ser zero). Portanto, ponto final .* significa zero ou mais de qualquer caractere. Então, juntando tudo, s/\..*// diz sed que se encontrar um ponto final, possivelmente seguido por qualquer coisa, então substitua-o por nada.

Comentários

  • Esta resposta pode ser elaborada para mim. entenda o que a parte s/ significa, mas e quanto a \..*?
  • @DanijelJ Eu adicionei algumas explicações. Pode sobrepõe-se ao que você já sabe, mas achei que era melhor do que deixar de fora algo que você não ' t. Avise-me se ajudar.
  • Sim, isso explica muito para mim. Eu entendi o \. Eu simplesmente não conseguia ' não entender o segundo .. Obrigado por esclarecer isso para mim.

Resposta

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

read -d . VERSION < /etc/debian_version 

Isto diz /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 nisso ele se divide no período e é atribuído à matriz $VERSION. Se a versão for 1.2.3, então ${VERSION[0]} == 1 ${VERSION[1]} == 2 e ${VERSION[2]} == 3.

Comentários

  • Isso é excelente!Eu ' nunca vi uma leitura sendo usada assim!

Resposta

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

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *