Ожидается унарный оператор

Я пытался выяснить, в чем дело, но просто не могу понять.

Эта часть, похоже, получает ошибку.

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

Я получаю эту ошибку:

calc_1.2: line 75: [: =: unary operator expected

Ответ 1

Если вы знаете, что всегда будете использовать bash, гораздо проще всегда использовать команду условного соединения с двумя скобками [[ ... ]], а не в Posix-совместимой версии с одним кронштейном [ ... ]. Внутри соединения [[ ... ]] словосочетание и расширение пути не применяются к словам, поэтому вы можете положиться на

if [[ $aug1 == "and" ]];

чтобы сравнить значение $aug1 со строкой and.

Если вы используете [ ... ], вам всегда нужно помнить о двойных кавычках:

if [ "$aug1" = "and" ];

Если вы не указываете расширение переменной, а переменная undefined или пустое, оно исчезает с места преступления, оставляя только

if [ = "and" ]; 

который не является допустимым синтаксисом. (Оно также потерпит неудачу с другим сообщением об ошибке, если $aug1 содержит пробелы или метасимволы оболочки).

Современный оператор [[ имеет множество других приятных функций, включая регулярное выражение.

Ответ 2

Попробуйте назначить значение $aug1, прежде чем использовать его в операциях if[]; после этого сообщение об ошибке исчезнет.

Ответ 3

Понадобился время, чтобы найти это, но обратите внимание, что если у вас есть ошибка интервала, вы также получите ту же ошибку:

[: =: unary operator expected

Правильно:

if [ "$APP_ENV" = "staging" ]

против

if ["$APP_ENV" = "staging" ]

Как всегда, параметр -x позволяет найти следующие значения:

set -x

Ответ 4

Вы также можете установить значение по умолчанию для переменной, поэтому вам не нужно использовать два "[", которые составляют два процесса ( "[" на самом деле является программой), а не один.

Это синтаксис: ${VARIABLE: -default}.

Все это нужно мыслить таким образом, что это "значение по умолчанию" представляет собой нечто отличное от "действительного" значения/содержимого.

Если это по какой-то причине невозможно, вам, вероятно, потребуется добавить такой шаг, как проверка наличия вообще значения в строках "if [-z $VARIABLE], затем эхо" переменная должна быть заполнена ", или" если [! -z $VARIABLE], а затем # все в порядке, перейдите к остальной части script".