2010-02-06 6 views
3

내가 스크립트가 칠 때Bourne 쉘 출구

cat $1 | while read line 
do 
    line=`echo $line | tr "[:lower:]" "[:upper:]"` 

    if [ "`echo $line | cut -f1 -d:`" = "foo" ] && \ 
     [ "`echo $line | cut -f2 -d:`" = "bar" ]; then 
     echo 'exsist' 
     exit 1; 
    fi 
done 

모든 후, 에코 및 최대 작동 다음 스크립트가가는 계속되지와 않고 종료 한 작동하지 않습니다. 어떤 아이디어.

감사

+0

UUOC 함께 할 수 있습니다 : 고양이 대신 $ 1 | 모든 라인

+0

-1 사용하여 외부 명령을 수행하는 동안 ... 잠시 ... 당신이 할 수 있습니다. – ghostdog74

답변

5

당신이 백 슬래시 필요하지 않습니다 -이 C 쉘이 아니다.

문제는 while 루프가 종료 서브 쉘에 있다고이지만 서브 쉘로 실행되기 때문에, 주요 스크립트가 계속됩니다. 맥락에서

는 간단한 수정은 아마도 :

while read line 
do 
    line=`echo $line | tr "[:lower:]" "[:upper:]"` 
    if [ "`echo $line | cut -f1 -d:`" = "foo" ] && 
     [ "`echo $line | cut -f2 -d:`" = "bar" ]; then 
     echo 'exist' 
     exit 1 
    fi 
done < $1 

당신이 (대신 '고양이 $ 1'의 '고양이'$에 @를 " ') 여러 파일을 처리 할 수있는 경우에, 당신은 일해야 조금 더 열심히 많이 힘들어 :이 1이 될 것이다 '동안'루프의 종료 상태 '고양이'와 '동안'으로 구성된 파이프 라인의 종료 상태를 확인

cat "[email protected]" | 
while read line 
do 
    line=`echo $line | tr "[:lower:]" "[:upper:]"` 
    if [ "`echo $line | cut -f1 -d:`" = "foo" ] && 
     [ "`echo $line | cut -f2 -d:`" = "bar" ]; then 
     echo 'exist' 
     exit 1 
    fi 
done 
[ $? != 0 ] && exit 1 

예 : 'foo : bar'가 행의 시작 부분에있는 경우.

grep -s -q "^foo:bar:" "[email protected]" && exit 1 

이 많이에게 루프 버전보다 적은 명령을 실행합니다 :

은 물론, 같은 것을 감지하는 다른 방법이 있습니다. ('^ foo : bar $'를 허용해야하는 경우 일반 grep 대신 egrep을 사용하십시오.)

+0

그다지 어렵지 않습니다. 동안 읽기 라인; ...; 다 <<(고양이 "$의 @") –

+0

고마워요. 그것은 – user174084

+1

@Charles, 그것은 bashism입니다. 은'bourne' 태그를 가정 – ghostdog74

0

테스트 위에 shopt -s nocasematch을 추가하여 대문자와 소문자를 구분하지 않아도됩니다. 대소 문자를 다시 설정하려면 shopt -u nocasematch.

+0

정말 지금까지 내 기억이가는 등의 nocasematch 옵션이 생각하지 않습니다, 기존의 Bourne 쉘을 의미한다. 내가 틀렸다면 나를 바로 잡아라. – ghostdog74

+1

는 지금까지 내 기억이가는대로, 나는 읽는 방법을 잊어 버린! –

1

당신은 대문자 텍스트를 소문자 텍스트에서 텍스트를 번역,하지만 낮은 경우에 대해 테스트, 그래서 당신은 결코 출구로 얻을 것입니다. 당신은 모든 줄을 대문자로 변환 할 이후

1

, 당신은이

#!/bin/sh 

tr '[:lower:]' '[:upper:]' < file | while IFS=":" read -r a b c 
do 
    case "$a $b" in 
     "FOO BAR") echo "exist";exit;; 
     *) echo "$a $b";; 
    esac 
done 

처럼 그것을 할 수 있습니다 또는 당신은 단지 AWK (Solaris 용 nawk)

nawk -F":" ' 
topper($1)=="FOO" && topper($2)=="BAR"{ 
    print "exist" 
    exit 
} 
{ 
    print topper($0) 
} 
' file 
관련 문제