2017-03-17 14 views
1

10.12.3의 결과를 처리하려고합니다. OS에 고려해야 할 선택적 세 번째 숫자 값이있는 경우 어떻게 코딩합니까? 그리고 물론, 이것은 종종 변경되기 때문에 확장 된 업데이트를 찾고 싶지는 않습니다. 그냥 메인 OS 10.12, 10.11, 10.10 등major 및 minor 버전 번호로만 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을하고 if/else 문 (들)의 결과를 사용할 수 있습니다

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

그래서 $osv 경우입니다 10.12.3, v10.12입니다. $osv이 단지 10.12 인 경우, v도이 값과 같습니다.

+0

은'awk'는 (-F' '지정된 구분자) 필드로 분할하고 인쇄 첫 번째 두 개의 특정 출력 필드 분리 합류, 입력으로 $의 osv''의 내용을 얻어 OFS와 함께. 이 출력은'$ (...) '구문 ... – ewcz

+1

@JamesDean을 사용하여 변수'v'에 저장되거나이 접근법을'sw_vers'와 결합하여 major.minor 버전을'v = – ewcz

+0

버전 번호가 이미 셸 변수에있는 경우 이것은 약간 무거운 것이지만 if (* 어쨌든'sw_vers -productVersion'을 호출하는 것은 가능한 접근법이지만,'sw_vers -productVersion | 컷 - 드. -f1-2'는 더 간단합니다. (잠재적으로 흥미로운 점은'awk'의'-F' 옵션은 일반적으로 _regex_를 기대하지만,'.'는 _literally_로 처리되는 예외입니다 - 아마도 어떤 문자로 나누어도 이해가되지 않을 것입니다. d는 빈 필드 만 가져옵니다.) – 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 문에서 글로브 스타일을 사용할 수있는 몇 가지 중복으로

    또한 globbing에서 사용됨) :

    • 은 개념적으로 더 간단하지만 정규식 (정규 표현식)보다 훨씬 강력합니다.

    • case는 문뿐만 아니라 ==[[ ... ]] 내부의 RHS에 스트링 매칭을 위해 사용될 수있다 (상기 참조; case 내부를, 이들의 사용은 심지어 POSIX 호환 임). 반대로

  • , 정규 표현식에=~ 연산자 [[ ... ]] 내부 스트링 매칭을 위해 사용될 수있다. @JamesDean