If 조건 연산자: 선언되지 않은 변수가 제공되면 단항 연산자가 필요합니다.

If 조건 연산자: 선언되지 않은 변수가 제공되면 단항 연산자가 필요합니다.

단항 연산자 문제로 인해 오류가 발생하는 아래 스크립트를 실행 중입니다. 기본 쉘 스크립트 프로그램에서는 이 기존_sum_check 변수를 계속해서 사용할 것이지만 어쨌든 이 검사를 수행하고 싶습니다. 이 오류를 방지하려면 어떻게 해야 합니까?

프로그램:

#!/bin/sh

latest_sum_check=10101;

if [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK = $latest_sum_check;

    echo $EXISTING_SUM_CHECK;
    echo "Please process";
else
    echo "Do not process"
fi

답변1

당신은 본질적으로 [ something != $bar ].

비어 있으면 $bar으로 바뀌는데 if [ something != ], 동등성 테스트에는 두 개의 피연산자가 필요하기 때문에 당연히 작동하지 않습니다. 적어도 Bash의 test/에는 [다음과 같이 말하는 재미있는 방법이 있습니다. 분명히 인수 수를 확인하고 두 개만 있으므로 첫 번째는 단항 연산자일 것으로 예상합니다. 하나도 something없어서 불평합니다.

따라서 변수 주위에 따옴표를 넣으십시오.:

if [ "$latest_sum_check" != "$EXISTING_SUM_CHECK" ]; then ...

EXISTING_SUM_CHECK그리고 이것은 등호와 변수 확장에서 나오는 모든 것을 매개변수로 사용하여 명령을 실행합니다 .

 EXISTING_SUM_CHECK = $latest_sum_check;

셸의 변수 할당은 주변에 공백을 사용하지 않습니다.

답변2

이는 선언되지 않은 변수 $EXISTING_SUM_CHECK로 인해 발생하는 테스트의 오류 조건입니다. 다음과 같은 또 다른 검사를 받아야 합니다.

if [ -z $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK=$latest_sum_check
elif [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then

이는 단항 연산을 사용하여 문자열의 길이가 0인지 확인합니다. !=는 테스트의 양쪽에 비어 있지 않은 값이 있어야 합니다.

이 문제를 해결하는 또 다른 방법은 다음과 같습니다.

if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then

변수가 설정되지 않았거나 null 또는 ''인 경우 두 값이 모두 X 이상의 값을 갖도록 강제합니다.

또한 참고할 점은 일반적으로 두 숫자를 비교하는 경우 !=보다 -ne를 사용하는 것이 좋습니다. !=는 문자열용으로 예약되어 있기 때문입니다. 그러나 -ne는 숫자 [0-9]에만 작동하며 md5sum 결과와 같은 16진수 비교에는 작동하지 않습니다.

관련 정보