Seuraavaa käytän tällä hetkellä Debian-version testaamiseen. Sen sijaan, että tekisin sen tällä tavalla, voinko tehdä siitä suppeamman?

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

Tiedän, että se ei ole houkuttelevin tapa tehdä tämä. Haluan ymmärtää kuinka käyttää tiedostoa osoitteessa /etc/debian_version versionumeron lukemiseksi ennen . ja jättää huomiotta sen jälkeinen numero.

Yritin käyttää

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

ja yritin myös

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

Mutta kumpikaan näistä ei toiminut minulle. Haluan todistaa skriptini tulevaisuudessa niin, että jos Debian 7.4 vapautetaan, minun ei tarvitse palata takaisin kaikkiin skripteihin, jotka luottavat tähän ja muuttaa niitä.

Olen myös tietoinen lsb_release -a jossa näytetään minulle suhteelliset tiedot, en vain tiedä kuinka ”leikata” mitä haluan siitä ja tarkistaa, että se on Debian 6 tai 7. Alkuperäinen komentosarja, kuten voitte kuvitella , on melko pitkä.

Muita viestejä, joihin voit viitata, arvostan myös käyttämällä menetelmää ”leikata” vastaus toisistaan vain haluamasi osa.

Vastaa

Voit tehdä haluamasi monin tavoin. Tämä poistaa vain desimaalipilkun ja kaiken sen jälkeisen versionumerosta:

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

\..* tarkoittaa jaksoa ( \.), jota seuraa nolla tai enemmän mitä tahansa merkkiä (.*). Täten lauseke sed tarkoittaa, että ilmaisu s/\..*// tarkoittaa ajanjakson ja kaiken seuraavan korvaamista millään. sed -komennon tulos tallennetaan ympäristömuuttujaan VERSION.

Edellä mainittu poistaa tarpeen if / then / elif /…/ fi-lausunnot. Se toimii sekä bash: n että tavallisen / bin / sh: n kanssa.

LISÄÄ: sed on virtaeditori: se tarkoittaa, että se lukee rivit stdinistä, muokkaa niitä ohjeiden mukaisesti ja (yleensä) lähettää ne stdoutiin. Tässä tapauksessa annamme sille ”korvaavan” käskyn. Esimerkiksi s/foo/bar/ tarkoittaa foo: n ensimmäisen esiintymisen löytämistä ja korvaamista barilla. Erityistapauksena s/foo// tarkoittaa, että korvaa foo ei millään. Meidän tapauksessamme haluamme korvata minkä tahansa merkin seuraavan jakson ei mitään. Nyt jakso on ””. paitsi että sed käsittelee pistettä normaalisti merkillä ”mikä tahansa merkki”. Joten meidän täytyy ”paeta” siitä asettamalla taaksepäin viiva eteenpäin. Kun sed näkee \., se tarkoittaa, että tarkoitamme kirjaimellista jaksoa. Haluamme myös poistaa kaikki merkit ajanjakson jälkeen. ”Minkä tahansa merkin” edustamiseksi käytämme pistettä . (ei pakoa). Yleisesti ottaen haluamme kuitenkin poistaa kaikki jaksoa seuraavat merkit riippumatta siitä, kuinka monta niitä on. Joten, kun sed ”-kielellä piste tarkoittaa mitä tahansa merkkiä, tähti tarkoittaa” mitä tahansa edellisen merkin lukumäärää ”(joka voi olla nolla). id = ”6f169f1965″>

tarkoittaa nollaa tai enemmän mitä tahansa merkkiä. Joten kaikki yhteen laskettuna, s/\..*// kertoo sed että jos se löytää jakson, jota mahdollisesti seuraa jokin, korvaa se sitten millään.

Kommentit

  • Voidaanko tätä vastausta kehittää minulle. ymmärrä mitä s/ osa tarkoittaa, mutta entä \..*?
  • @DanijelJ Lisäsin selityksen. Se voi päällekkäin sen kanssa, mitä jo tiedät, mutta ajattelin, että se oli parempi kuin jättää pois jotain, jota et ' t. Kerro minulle, jos se auttaa.
  • Kyllä se selittää minulle paljon. Ymmärsin \., en vain voinut ' ymmärtää toista .. Kiitos, että selvitit tämän minulle.

Vastaa

Tässä on ratkaisu, joka käyttää bashia, ei ulkoisia apuohjelmia. , ja se on yksi puhelu

read -d . VERSION < /etc/debian_version 

Tämä lukee /etc/debian_version, jakaa syötteen jaksolle (.), määrittää kaiken ajanjaksoa edeltävälle ryhmälle VERSION ja hylkää kaiken sen jälkeen. / div>

Tämä on hieman erilainen siinä mielessä, että se tallentaa kaiken VERSION_MINOR-jakson jakson jälkeen.


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

Tämä on siinä tehokkain se jakautuu jaksoon ja määrittää taulukon $VERSION .Jos versio on 1.2.3, ${VERSION[0]} == 1 ${VERSION[1]} == 2 ja ${VERSION[2]} == 3.

Kommentit

  • Tämä on erinomaista!En ' ole koskaan nähnyt lukea olevan näin käytetty!

Vastaa

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

Tätä voidaan tietysti laajentaa tunnistamaan useampia versioita.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *