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
vê \.
, 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
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.
s/
significa, mas e quanto a\..*
?\.
Eu simplesmente não conseguia ' não entender o segundo.
. Obrigado por esclarecer isso para mim.