bash에서 if [ ...와 test ... 문의 차이점

bash에서 if [ ...와 test ... 문의 차이점

다음을 고려하세요:

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_match21을 반환합니까?

답변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

ifNull이 아닌 경우 명령문의 분기가 수행되지 않았으므로 두 명령문의 종료 상태는 0입니다.$m

~에서POSIX 표준:

명령의 종료 상태는 실행 또는 복합 목록의 종료 if상태여야 하며 , 실행되지 않은 경우 0이어야 합니다.thenelse


두 가지 기능을 다음으로 압축할 수 있습니다.

is_match () {
    grep -q -F -e "$1" file.txt
}

여기서는 grep호출자에게 종료 상태를 제공합니다. 또한 일치하는 항목이 발견되면 종료하므로 반드시 file.txt파일을 끝까지 읽을 필요는 없습니다 .grep -q

관련 정보