문제

다음 스크립트가 있습니다

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

모든 것이 에코까지 작동하며 스크립트가 종료되면 종료되지 않으며 계속 진행됩니다. 모든 아이디어.

감사

도움이 되었습니까?

해결책

당신은 그 백 슬래시가 필요하지 않습니다 - 이것은 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

여러 파일 ( 'cat $ 1'대신 'Cat "$@"')을 처리 해야하는 경우 작업해야합니다. 훨씬 더 어렵다 조금 더 단단하다 :

cat "$@" |
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

이것은 'cat'과 'while'으로 구성된 파이프 라인의 종료 상태를 확인합니다. 이는 'while'루프의 종료 상태 인 'foo : bar'가 선.

물론 다음과 같은 다른 방법이 있습니다.

grep -s -q "^foo:bar:" "$@" && exit 1

루프 버전보다 명령이 훨씬 적습니다. ( '^foo : bar $'를 허용 해야하는 경우 일반 grep 대신 egrep를 사용하십시오.)

다른 팁

텍스트를 소문자 텍스트에서 대문자 텍스트로 번역 한 다음 소문자에 대해 테스트하면 출구로 이동하지 않습니다.

모든 라인마다 대문자로 변환하려면 이렇게 할 수 있습니다.

#!/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 for solaris)로 할 수 있습니다.

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

추가하여 조건부를 케이스에 민감하게 만들 수 있습니다 shopt -s nocasematch 시험 위. 사물을 사례에 민감하게 설정하려면 : shopt -u nocasematch.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top