Оператор If Condition: ожидается унарный оператор, если указана неопределенная переменная

Оператор If Condition: ожидается унарный оператор, если указана неопределенная переменная

Я запускаю скрипт ниже, который выдает мне ошибку с унарным оператором. В основной программе скрипта оболочки я буду использовать эту переменную existing_sum_check в дальнейшем, но я хочу выполнить эту проверку в любом случае. Как мне избежать этой ошибки?

Программа:

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

решение1

По сути, у вас есть [ something != $bar ].

Если $barпусто, то это превращается в if [ something != ], что, конечно, не работает, так как проверка равенства требует двух операндов. Хотя, по крайней мере, Bash test/ [имеет забавный способ указать это: по-видимому, он проверяет количество аргументов, и поскольку их всего два, ожидает, что первый будет унарным оператором. Его somethingнет, поэтому он жалуется.

Поэтому заключите переменные в кавычки.:

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

И это запускает команду EXISTING_SUM_CHECKсо знаком равенства и всем, что получается из расширения переменной в качестве параметров:

 EXISTING_SUM_CHECK = $latest_sum_check;

Присваивание переменных в оболочке не требует пробелов вокруг себя.

решение2

Это условие ошибки вашего теста из-за наличия необъявленной переменной $EXISTING_SUM_CHECK. Вам следует выполнить еще одну проверку, например:

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

Здесь используется унарная операция для проверки того, имеет ли строка нулевую длину. != требует, чтобы обе стороны проверки имели непустое значение.

Другой способ решения этой проблемы:

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

Что заставит оба значения иметь значение не менее X, если переменная не установлена ​​или равна null или ''.

Также следует отметить, что обычно при сравнении двух чисел рекомендуется использовать -ne вместо !=, поскольку != зарезервировано для строк. Однако -ne работает только для цифр [0-9], а не для шестнадцатеричных сравнений, таких как результаты md5sum.

Связанный контент