문제
다음 스크립트가 있습니다
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
.
제휴하지 않습니다 StackOverflow