Operador If Condition: operador unário esperado quando uma variável não declarada é fornecida

Operador If Condition: operador unário esperado quando uma variável não declarada é fornecida

Estou executando o script abaixo, que gera erros com problema de operador unário. No programa shell script principal, usarei esta variável existente_sum_check no futuro, mas quero realizar essa verificação de qualquer maneira. Como posso evitar esse erro?

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

Responder1

Você tem essencialmente [ something != $bar ].

Se $barestiver vazio, isso se transforma em if [ something != ], o que obviamente não funciona, pois o teste de igualdade requer dois operandos. Embora pelo menos o test/ do Bash [tenha uma maneira engraçada de afirmar isso: aparentemente ele verifica o número de argumentos e, como há apenas dois, espera que o primeiro seja um operador unário. Não tem something, então reclama.

Então, coloque aspas nas variáveis:

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

E isso executa um comando EXISTING_SUM_CHECKcom sinal de igual e o que vier da expansão da variável como parâmetros:

 EXISTING_SUM_CHECK = $latest_sum_check;

As atribuições de variáveis ​​no shell não ocupam espaços ao seu redor.

Responder2

Esta é uma condição de erro do seu teste devido a uma variável não declarada $EXISTING_SUM_CHECK. Você deve fazer outra verificação, como:

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

Isso usa uma operação unária para verificar se a string tem comprimento zero. != requer que ambos os lados do teste tenham um valor não vazio.

Outra maneira de resolver isso pode ser:

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

O que força ambos os valores a terem um valor de pelo menos X se a variável não estiver definida ou for nula ou ''.

Observe também que, normalmente, se você estiver comparando dois números, -ne é recomendado em vez de! =, pois! = é reservado para strings. No entanto, -ne funciona apenas para numerais [0-9], e não para comparações hexadecimais, como resultados de md5sum.

informação relacionada