Operador de condición If: se espera un operador unario cuando se proporciona una variable sin etiquetar

Operador de condición If: se espera un operador unario cuando se proporciona una variable sin etiquetar

Estoy ejecutando el siguiente script que me arroja errores con un problema de operador unario. En el programa de script de shell principal, usaré esta variable existente_sum_check en el futuro, pero quiero realizar esta verificación de todos modos. ¿Cómo puedo evitar este error?

Programa:

#!/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

Respuesta1

Tienes esencialmente [ something != $bar ].

Si $barestá vacío, se convierte en if [ something != ], lo que por supuesto no funciona, ya que la prueba de igualdad requiere dos operandos. Aunque al menos test/ de Bash [tiene una forma divertida de decir eso: aparentemente verifica el número de argumentos y, como solo hay dos, espera que el primero sea un operador unario. No hay somethingninguno, entonces se queja.

Entonces, pon comillas alrededor de las variables.:

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

Y esto ejecuta un comando EXISTING_SUM_CHECKcon el signo igual y lo que surja de la expansión de la variable como parámetros:

 EXISTING_SUM_CHECK = $latest_sum_check;

Las asignaciones de variables en el shell no ocupan espacios a su alrededor.

Respuesta2

Esta es una condición de error de su prueba debido a que tiene una variable no declarada $EXISTING_SUM_CHECK. Debería tener otro control como:

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

Esto utiliza una operación unaria para verificar si la cadena tiene longitud cero. != requiere que ambos lados de la prueba tengan un valor que no esté vacío.

Otra forma de solucionar esto puede ser:

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

Lo que obliga a ambos valores a tener un valor de al menos X si la variable no está configurada o es nula o ''.

También hay que tener en cuenta que, normalmente, si se comparan dos números, se recomienda -ne en lugar de !=, ya que != está reservado para cadenas. Sin embargo, -ne solo funciona para números [0-9] y no para comparaciones hexadecimales como los resultados de md5sum.

información relacionada