Quello che segue è quello che sto attualmente usando per testare la versione di Debian. Invece di farlo in questo modo, posso renderlo più succinto?

#!/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 

So che non è il modo più attraente per farlo. Quello che voglio è capire come usare il file in /etc/debian_version per leggere il numero di versione prima di . e ignorare il numero dopo.

Ho provato a utilizzare

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

e ho anche provato

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

Ma nessuno di questi ha funzionato per me. Voglio rendere il mio script a prova di futuro in modo che se Debian 7.4 viene rilasciata, non dovrò tornare indietro su tutti gli script che si basano su questo e alterarli

Sono anche a conoscenza del lsb_release -a che mi mostra le informazioni relative, semplicemente non so come “tagliare” quello che voglio da quello e controllo che sia Debian 6 o 7. Lo script originale, come puoi immaginare , è piuttosto lungo.

Qualsiasi altro post a cui puoi indicarmi, sarebbe apprezzato anche con luso del metodo di “tagliare” la risposta per sezionare solo la parte che voglio.

Risposta

Ci sono molti modi per fare quello che vuoi. Questo rimuove solo il punto decimale e tutto ciò che segue dal numero di versione:

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

\..* significa un punto ( \.) seguito da zero o più caratteri qualsiasi (.*). Pertanto, per sed, lespressione s/\..*// significa sostituire il punto e tutto ciò che segue con niente. Il risultato del comando sed viene salvato nella variabile dambiente VERSION.

Quanto sopra elimina la necessità del if / then / elif /…/ dichiarazioni fi. Funzionerà sia con bash che con lordinario / bin / sh.

ALTRO: sed è un editor di flusso: ciò significa che legge le righe da stdin, le modifica secondo le istruzioni e (tipicamente) le invia a stdout. In questo caso, gli diamo unistruzione “sostitutiva”. Ad esempio, s/foo/bar/ significa trovare la prima occorrenza di foo e sostituirla con bar. Come caso speciale, s/foo// significa sostituire foo con niente. Nel nostro caso, vogliamo sostituire un punto seguito da qualsiasi carattere con niente. Ora, un punto è “.” tranne che sed normalmente considera un punto come “qualsiasi carattere”. Quindi, dobbiamo “sfuggirle” inserendo una barra rovesciata davanti. Quando sed vede \., sa che si intende un punto letterale. Vogliamo anche cancellare tutti i caratteri successivi al punto. Per rappresentare “qualsiasi carattere”, utilizziamo un punto . (senza escape). In generale, però, vogliamo eliminare tutti i caratteri successivi al punto, indipendentemente da quanti sono. Quindi, mentre nella lingua sed “, un punto indica qualsiasi carattere, la stella significa” qualsiasi numero del carattere precedente “(che potrebbe essere zero). Quindi punto-stella .* significa zero o più caratteri qualsiasi. Quindi, mettendo tutto insieme, s/\..*// dice sed che se trova un punto, eventualmente seguito da qualcosa, sostituirlo con niente.

Commenti

  • Questa risposta può essere elaborata per me. I capire il significato della parte s/, ma che dire di \..*?
  • @DanijelJ Ho aggiunto qualche spiegazione. Potrebbe si sovrappongono a ciò che già sai ma ho pensato che fosse meglio che omettere qualcosa che non hai ' t. Fammi sapere se aiuta.
  • Sì, questo mi spiega molto. Ho capito \. Non potevo ' capire il secondo .. Grazie per aver chiarito questo per me.

Rispondi

Ecco “una soluzione che usa bash, nessuna utilità esterna , ed è una singola chiamata

read -d . VERSION < /etc/debian_version 

Questo legge /etc/debian_version, divide linput sul punto (.), assegna tutto prima del punto a VERSION e ignora tutto dopo.


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

Questo è leggermente diverso in quanto salva tutto dopo il punto in VERSION_MINOR


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

Questo è il più potente in quanto si divide in base al periodo e assegna allarray $VERSION. Se la versione è 1.2.3, ${VERSION[0]} == 1 ${VERSION[1]} == 2 e ${VERSION[2]} == 3.

Commenti

  • Questo è eccellente!' non ho mai visto letture usate in questo modo!

Risposta

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

Questo può essere esteso per riconoscere più versioni, ovviamente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *