Ошибка «ожидается унарный оператор» в Bash if условии

225

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

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

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
Jordanss10
источник
4
Я думаю, что ваше ifзаявление по строке 75 нуждается в fi.
Стив
7
Если сомневаетесь, указывайте vars.
Коола
9
@koola, цитаты всегда.
двоюродный брат Кокаин

Ответы:

480

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

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

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

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

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

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

if [ = "and" ]; 

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

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

RICi
источник
9
"современный"? Не [[ всегда был в Баш? Он был в скорлупе Корна уже более двадцати лет, и предшествует bash. (Я знаю, что вы имеете в виду, хотя)
cdarke
31

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

[: =: unary operator expected

Верный:

if [ "$APP_ENV" = "staging" ]

против

if ["$APP_ENV" = "staging" ]

Как всегда установка -xпеременной отладки помогает найти эти:

set -x
Юха Вехния
источник
Кто-то завещал мне эту ошибку в сценарии сборки. Спасло меня некоторое время, спасибо!
Кайл
8

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

Йили
источник
0

ты говоришь ... :

elif [$ operation = "man"]; тогда if [$ aug1 = "add"]; then # <- Строка 75 echo "Man Page for: add" echo "" echo "Синтаксис: add [number 1] [number 2]" echo "" echo "Описание:" echo "Добавить два разных числа вместе." echo "" echo "Информация:" echo "Добавлено в v1.0" echo "" elif [-z $ aug1]; затем эхо "Пожалуйста, укажите команду для чтения страницы руководства." else echo "Для этой команды нет справочной страницы." фи

я думаю, что это просто пространство ... сделать так:

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
Ренан Моура
источник
-11

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

Это идет по этому синтаксису: $ {VARIABLE: -default}.

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

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

El Guesto
источник
3
[[не порождает два процесса, это встроенная оболочка (и [тоже встроенная в Bash). [[отличается от того [ [, который обрабатывает второй [как строку
user123444555621