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 $bar
está 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 something
ninguno, 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_CHECK
con 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.