2017-03-17 11 views
1

10.12.3の結果を処理しようとしています - OSにオプションの第3の数値がある場合、どのようにコード化しますか?もちろん、これは頻繁に変更されるので、私は拡張アップデートを探したくありません。ただ、メインOS 10.12、10.11、10.10、などmacOSバージョン番号とメジャーバージョン番号とマイナーバージョン番号だけを一致させてください

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 

感謝。

答えて

1

あなたは、あなたの変数$osvを取るだけで最初の2つのフィールド(フィールドは.で区切られていることを仮定して)を維持し、if/else声明(S)で結果を使用することができます。

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

ので$osvがある場合10.12.3,v10.12となります。 $osvが単に10.12である場合、vもこの値に等しくなります。

+0

@JamesDean 'awk'は、その入力として' $のosv'の内容を取るフィールドに分割し( '-F'で指定された区切り文字)、その後、最初の2つだけが指定された出力フィールドセパレータと接合印刷しますOFSと一緒に。この出力は '$(...)'構文... – ewcz

+1

@JamesDeanを使って変数 'v'に保存されるか、このアプローチを' sw_vers'と組み合わせてmajor.minorバージョンを 'v = – ewcz

+0

バージョン番号がすでにシェル変数に入っている場合、これは少し重いですが、もしあればとにかく 'sw_vers-productVersion'を呼び出しています。これは実行可能なアプローチですが、' sw_vers -productVersion |カットド。 -f1-2'は簡単です。 (潜在的に興味深いものとして、 'awk'の' -F'オプションは通常_regex_を期待しますが、 '.'は例外として処理されます_literally_ - おそらく任意の文字による分割が意味をなさない空のフィールドしか取得できません)。) – mklement0

2

使用=~[[ ... ]]内部バッシュの正規表現マッチング演算子:

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

これは、例えば、10.1210.12.3両方に一致。

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 

注:

  • Patterns(あなたも、あなたのケースで最良の選択かもしれcase文にglobスタイルパターンを使用することができますいくつか重複して

    グロブでも使用されているように):

    • は概念的に簡単ですが、正規表現(正規表現)よりもはるかに強力です。

    • case文ならびに==[[ ... ]]内部のRHS上の文字列マッチングのために使用することができる(上記参照;内部caseが、それらの使用もPOSIX準拠です)。一方

  • 正規表現のみ=~オペレータと[[ ... ]]内部文字列マッチングのために使用することができます。

関連する問題