2017-03-17 3 views
1

Essayer de traiter un résultat de 10.12.3 - comment le coder lorsque le système d'exploitation a une troisième valeur numérique optionnelle à considérer? Et, bien sûr, cela change souvent, donc je ne veux pas chercher des mises à jour étendues. Juste le principal OS 10.12, 10.11, 10.10, etc.Faire correspondre le numéro de version de macOS uniquement par numéro de version majeur et mineur

if [ "$osv" = "10.12" ]; 
    then 
     appi="Applications:App Store.app:Contents:Resources:AppIcon.icns" 
    elif [ "$osv" = "10.11" ]; 
    then 
     appi="Applications:App Store.app:Contents:Resources:appStore.icns" 
    else 
     exit 
    fi 

merci.

Répondre

1

vous pouvez prendre votre variable $osv, ne garder que les deux premiers champs (en supposant que les champs sont délimités par .), et utiliser le résultat dans la déclaration if/else (s):

v=$(echo "$osv" | awk -F. 'BEGIN{OFS="."}{print $1,$2}') 

si $osv est 10.12.3, v sera 10.12. Dans le cas $osv est simplement 10.12, v sera égale à cette valeur aussi bien.

+0

@JamesDean 'awk' prend le contenu de' osv' de $ en tant que son entrée, il se divise en champs (délimiteur spécifié avec '-f'), puis imprime uniquement les deux premiers joints avec le séparateur de champs de sortie spécifié avec 'OFS'. Cette sortie est ensuite enregistrée dans la variable 'v' en utilisant la syntaxe' $ (...) '... – ewcz

+1

@JamesDean ou vous pouvez combiner cette approche avec' sw_vers' et obtenir la version major.minor directement en tant que 'v = $ (sw_vers -productVersion | awk -F. 'BEGIN {OFS = "."} {print $ 1, $ 2}') ' – ewcz

+0

Si le numéro de version est déjà dans une variable shell, c'est un peu lourd, mais si vous appelez 'sw_vers -productVersion' de toute façon, c'est une approche viable, bien que' sw_vers -productVersion | couper -d. -f1-2' est plus simple. (En aparté potentiellement intéressant: l'option '-F' de' awk' s'attend normalement à un _regex_, mais en passant '.' est une exception qui est traitée _literally_ - peut-être parce que la séparation de n'importe quel caractère n'a pas de sens (vous ' d n'obtient jamais que des champs vides).) – mklement0

2

Utilisez =~, opérateur regex correspondant Bash, à l'intérieur [[ ... ]]:

if [[ $osv =~ ^10\.12(\.?|$) ]]; # ... 

Ce correspond à la fois 10.12 et 10.12.3, par exemple.

Avec une duplication, vous pouvez également utiliser des modèles glob de style dans un communiqué case, qui peut être le meilleur choix dans votre cas:

osv=$(sw_vers -productVersion) # yields, e.g., '10.12' or '10.12.3' 
case $osv in 
    10.12|10.12.*) 
    appi="Applications:App Store.app:Contents:Resources:AppIcon.icns" 
    ;; 
    10.11|10.11.*) 
    appi="Applications:App Store.app:Contents:Resources:appStore.icns" 
    ;; 
    *) 
    exit 
esac 

Note:

  • Patterns (comme également utilisé dans la globalisation) sont:

    • conceptuellement plus simple, mais beaucoup moins puissant que regexes (expressions régulières).

    • peut être utilisé pour la correspondance de chaîne sur la partie droite de l'intérieur ==[[ ... ]] ainsi que dans les états case (voir ci-dessus; à l'intérieur de case, leur utilisation est encore compatible POSIX).

  • En revanche, regexes ne peut être utilisé pour la correspondance de chaîne à l'intérieur [[ ... ]] avec l'opérateur =~.