다음을 고려하세요:
echo "hello" > file.txt
is_match1 () {
local m
m=$(cat "file.txt" | grep -F "$1")
if [ -z "$m" ]; then
return 1
fi
}
is_match2 () {
local m
m=$(cat "file.txt" | grep -F "$1")
test -z "$m" && return 1
}
is_match1 "hello"
echo "$?"
0
is_match2 "hello"
echo "$?"
1
왜 is_match2
1을 반환합니까?
답변1
질문의 상황에 따라 m
두 기능의 값을 모두 얻으십시오.hello
지금 봐
test -z "$m" && return 1
여기서 무슨 일이 일어나고 있어야합니까? 테스트 -z
는잘못된, 옳은? 따라서 return 1
실행되지 않습니다. 대신, 함수는 무엇을 반환합니까? 각 함수가 $?
마지막에 반환하는 값입니다. 이 경우 값은 목록의 결과인 1입니다 &&
.
테스트하고 싶은 것은
if [ -z "$m" ]; then return 1; fi
비교하다
if test -z "$m"; then return 1; fi
if
Null이 아닌 경우 명령문의 분기가 수행되지 않았으므로 두 명령문의 종료 상태는 0입니다.$m
~에서POSIX 표준:
명령의 종료 상태는 실행 또는 복합 목록의 종료
if
상태여야 하며 , 실행되지 않은 경우 0이어야 합니다.then
else
두 가지 기능을 다음으로 압축할 수 있습니다.
is_match () {
grep -q -F -e "$1" file.txt
}
여기서는 grep
호출자에게 종료 상태를 제공합니다. 또한 일치하는 항목이 발견되면 종료하므로 반드시 file.txt
파일을 끝까지 읽을 필요는 없습니다 .grep -q