2012-01-02 3 views
2

내가 문자열의 마지막 옵트 전에 문자열의 일부를 추출해야 쉘 Solaris 10에서 나쁜 대체를 얻기 : 내가 사용Bourne 씨는

단지 /opt/novell/opt/eDirectory/ 부분을 원하는

NDS=/opt/novell/opt/eDirectory/opt/abc 

NDSHOME=${NDS%opt*} 하지만 이 스크립트는 Linux 및 AIX에서 제대로 작동하지만 Solaris 10에서 Bourne 셸 을 사용하면 잘못된 대체가 발생합니다. 누군가가이 해결책을 찾을 수 있습니까 ??

+1

Solaris의'/ bin/sh' 명령은 실제 ​​(System V) Bourne 쉘입니다. 대신 Korn 쉘 (또는 Bash)을 사용하는 것을 고려해야합니다. –

답변

0

Solaris '/ bin/sh는 Posix와 호환되지 않습니다.이 일반적으로 내가 명령 치환을위한 backtics 대신 $()을 사용하지만, 나도 Solaris에서 그 일을 생각하지 않는다 :

당신은 sed

NDSHOME=`echo "$NDS" | sed 's/^\(.*\)\<opt\>.*$/\1/'` 

참고로 다음 해결 방법을 시도 할 수 있습니다. opt은 내 단어 경계

$ echo $NDS 
/opt/novell/opt/eDirectory/opt/helicopter 
$ echo "$NDS" | sed 's/^\(.*\)\<opt\>.*$/\1/' 
/opt/novell/opt/eDirectory/ 
+0

고마워. 모든 플랫폼에서 작동하고 있습니다. – gold

+0

"Solaris/bin/sh is notoriously ..."라고 써야합니다. Solaris 자체는 확실히 POSIX와 호환됩니다. – jlliagre

+0

@jlliagre 충분히 공정하고 변경되었습니다. – SiegeX

0

대신 Bourne-Again 셸을 사용하십시오.

+0

우리는 bourne shell 만 사용해야하는 쉘을 변경할 수있는 옵션이 없습니다. – gold

+1

그럼 당신은 SOL입니다. 'sed' 등을 대신 사용하십시오. –

1

dirname 명령 인쇄를 제외한 모든 인수로 주어진 경로 이름의 마지막 수준과 일치하지 않도록

편집 그것을 변경되었습니다.

$ NDS=/opt/novell/opt/eDirectory/opt/abc 
$ NDSHOME=`dirname $NDS` 
$ echo $NDSHOME 
/opt/novell/opt/eDirectory/opt 

(필요에 따라 export를 추가합니다.)

편집 :

는 위의이 경우에는 작동하지 않습니다. 운영자는 마지막 구성 요소가 아닌 opt 다음에 오는 경로의 모든 구성 요소를 제거하려고합니다. 다른 사람들에게 유용 할 수 있도록 여기에 남겨 두겠습니다.

당신 루프에서 사용 dirname (basename에 의해 결정) 마지막 구성 요소는`선택 하 '인 경우 중지 :

NDSHOME="$NDS" 
while [ "`basename $NDSHOME`" != opt ] ; do 
    NDSHOME="`dirname $NDSHOME`" 
done 

하지만 그것을 할 필요가보다 더 복잡하다; sed가 더 나은 솔루션입니다.

SiegeX의 대답은 좋지만 경로 구성 요소가 아닌 opt을 문자열로 처리합니다.예를 들어,

/opt/novell/opt/eDirectory/opt/helicopter 

/opt/novell/opt/eDirectory/opt/helic 

으로하는이 시도집니다 :

NDSHOME=`echo "$NDS" | sed 's,\(.*\)/opt/.*$,\1,'` 

이 (구분자로 ,의 사용보다는 /을 참고, 그래서에서 / 문자 패턴을 이스케이프 할 필요는 없습니다.)

+0

그가 원하는 출력을 얻으려면'dirname'을 두 번해야합니다. – SiegeX

+0

opt에서 하나 또는 두 개의 레벨 만 있을지 확신하지 못합니다. 레벨 수에는 제한이 없습니다. 따라서 우리는 dirname을 사용할 수 없습니다. – gold

1

Solaris는 확실히 POSIX (및 xpg4 및 susv3과 같은 여러 관련 표준)을 준수하지만 이전 버전과의 호환성도 매우 중요합니다.

부작용은 이러한 두 기능이 어떤 식 으로든 충돌 할 경우 영향을받는 명령이 기본적으로 POSIX가 레거시 스크립트를 손상시키지 않는지 여부입니다.

PATH=/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:$PATH 

하고 엄격한 준수가 필요하지 않은 경우, 또는 /usr/xpg4/bin/sh

에 로그인 쉘을 설정

당신은 그냥이 같은 경로를 설정, POSIX 호환성을 원하고 어떤 기존 스크립트 문제가 없어야한다 , 기본 쉘로 /bin/ksh을 사용하면됩니다.

Solaris 10 및 이전 버전에서는 새로운 스크립트에서 실제로는 /bin/sh을 사용하지 않아야합니다.

참조 용 Solaris 10 standards 매뉴얼 페이지 및 Solaris 11 용 설명서는 here입니다.

+0

감사합니다. 이것은 정말 유용합니다. – gold

관련 문제