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
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.
s/
osa tarkoittaa, mutta entä\..*
?\.
, en vain voinut ' ymmärtää toista.
. Kiitos, että selvitit tämän minulle.