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 $bar
estiver 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_CHECK
com 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.