2014-06-20 13 views
7

Ho il seguente:bash regex per abbinare semantica numero di versione

versionNumber=$(sw_vers -productVersion) # Finds version number 

versionShort=${versionNumber:0:4} # Cut string to 1 decimal place for calculation 

che funziona quando le versioni sono come questo:

10.9.2 
10.9.5 

ma non corrisponderanno

10.10.3 

come restituirà solo

10.1 

ma voglio il versionShort da impostare per

10.10 

Sono voler corrispondere alla versione principale, il primo punto e la versione secondaria come sopra.

risposta

10

Regexpless soluzione - tagliare ultimo punto e tutto ciò che segue è:

versionShort=${versionNumber%.*} 
2

Regexp soluzione:

[[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}" 

Sarà sempre stampare primi due numeri, ad esempio tutti questi:

10.5 
10.5.9 
10.5.8.2 

Produrrà l'uscita 10.5. Puoi anche aggiungere una clausola else per verificare se è successo qualcosa di sbagliato (nessuna corrispondenza trovata).

Ecco una versione più lunga:

if [[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]]; then 
    versionShort=${BASH_REMATCH[0]} 
else 
    echo "Something is wrong with your version" >&2 
fi 
+0

come restituisco il risultato a una variabile? – lukemh

+0

questo non funziona per me. – lukemh

+0

@lukemh Ho aggiunto una versione più lunga che potrebbe essere più chiara per te. Se non funziona ... sei sicuro che stai usando bash? Se sì, allora quale versione? Nella versione 3 devi mettere il lato destro dell'espressione condizionale in una variabile. I tag –

4

avevo una domanda simile, ma avevo bisogno di accesso a tutti i 3 segmenti. Ho fatto un po 'di ricerca e sperimentazione e ho trovato questo per lavorare bene

product_version=$(sw_vers -productVersion) 
semver=(${product_version//./ }) 
major="${semver[0]}" 
minor="${semver[1]}" 
patch="${semver[2]}" 
echo "${major}.${minor}.${patch}" 

Per rispondere direttamente a questa domanda, si potrebbe

product_version=$(sw_vers -productVersion) 
semver=(${product_version//./ }) 
major="${semver[0]}" 
minor="${semver[1]}" 
patch="${semver[2]}" 
versionShort="${major}.${minor}" 

oppure è possibile utilizzare meno variabili

product_version=$(sw_vers -productVersion) 
semver=(${product_version//./ }) 
versionShort="${semver[0]}.${semver[1]}" 
+1

Come funziona "semver = ($ {product_version //./})"? Sfortunatamente ottengo semver = "10.11.6 //./" quando provo questo. –

Problemi correlati