Я запускаю скрипт ниже, который выдает мне ошибку с унарным оператором. В основной программе скрипта оболочки я буду использовать эту переменную 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.