Se Condition operator: operador unário esperado quando a variável undecalared é fornecida

1

Estou executando o script abaixo, que gera erros com um problema de operador unário. No programa principal de script de shell, usarei essa variável existing_sum_check na linha, mas quero fazer 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
    
por Rajez 28.11.2017 / 17:52

2 respostas

2

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

Se $bar estiver vazio, isso se transforma em if [ something != ] , o que obviamente não funciona, já que 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. O something não é um, então ele reclama.

Então, coloque aspas em volta das variáveis :

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

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

 EXISTING_SUM_CHECK = $latest_sum_check;

Atribuições variáveis no shell não ocupam espaços ao redor delas.

    
por 28.11.2017 / 18:25
1

Esta é uma condição de erro do seu teste devido a ter uma variável não declarada $ EXISTING_SUM_CHECK. Você deve ter outro cheque 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 ter um valor de pelo menos X se a variável não estiver definida ou nula ou ''.

Note também que, normalmente, se você estiver comparando dois números, recomenda-se que seja sobre! =, já que! = é reservado para strings. No entanto, apenas um funciona para numerais [0-9] e não comparações hexadecimais, como resultados de md5sum.

    
por 28.11.2017 / 18:05