단항 연산자 문제로 인해 오류가 발생하는 아래 스크립트를 실행 중입니다. 기본 쉘 스크립트 프로그램에서는 이 기존_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진수 비교에는 작동하지 않습니다.