If 문은 두 개의 cmp 결과에 대해 "else" 응답을 제공합니다.

If 문은 두 개의 cmp 결과에 대해 "else" 응답을 제공합니다.

예상치 못한 결과를 얻었습니다.

COMPARE(){
    if [ ! cmp $IPPATH/ip.old $IPPATH/ip.new >/dev/null 2>&1 ]; then
            echo compare going to create
            CREATE
    else
            echo same
    fi
}

파일을 비교하려고 하는데 파일이 동일하면 아무 작업도 수행하지 않지만(예: display same) 동일하지 않으면 표시 compare going to create한 다음 CREATE함수를 실행합니다.

그러나 same파일이 동일할 때와 확실히 동일하지 않을 때 동일한 "" 결과를 얻습니다.

다음은 올바르게 표시됩니다(원하는 대로).

echo `cat $IPPATH/ip.old`
echo `cat $IPPATH/ip.new`

답변1

[테스트의 문자는 if기록되는 종류의 평가를 수행하도록 쉘에 지시했음을 의미합니다.man test

[이는 대부분의 쉘에 내장되어 있으며 약간 다른 기능을 구현할 ksh수 있으므로 해당 매뉴얼 페이지와 정확히 일치하지 않을 수 있습니다 .bashzsh

그러나 이것이 수행하지 않는 한 가지는 실행입니다.외부명령을 내리고 결과를 테스트합니다.

그러니 우리는 다른 방법으로 할 수 있어요

cmp예를 들어, 명령의 출력이 비어 있지 않은지 테스트할 수 있습니다 .

if [ -n "$(cmp $IPPATH/ip.old $IPPATH/ip.new)" ]
then
  echo different
else
  echo same
fi

또는 cmp래핑 없이 원래 의도에 더 가까운 반환 코드를 호출하고 테스트 할 수 있습니다 [...].

if ! cmp $IPPATH/ip.old $IPPATH/ip.new > /dev/null 2>&1
then
  echo different
else
  echo same
fi

관련 정보