단항 연산자 문제에 대한 오류가 발생하는 아래 스크립트를 실행 중입니다. 기본 셸 스크립트에서는 아래의 기존_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
/에는 적어도 [
이를 설명하는 흥미로운 방법이 있지만, 인수의 수를 확인하고 인수가 2개뿐이므로 첫 번째 인수가 단항 연산자일 것으로 예상합니다. 하나도 없어서 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인지 확인합니다. != 테스트에서는 양쪽에 null이 아닌 값이 있어야 합니다.
이 문제를 해결하는 또 다른 방법은 다음과 같습니다.
if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then
변수가 설정되지 않거나 null 또는 ""인 경우 두 값이 모두 X 이상이 되도록 강제합니다.
또한 일반적으로 두 숫자를 비교하려면 != 대신 -ne를 사용하는 것이 좋습니다. !=는 문자열용으로 예약되어 있기 때문입니다. 그러나 -ne는 숫자 [0-9]에만 작동하며 md5sum 결과와 같은 16진수 비교에는 작동하지 않습니다.