Помилка "неоднакового очікуваного оператора" у Bash, якщо це стан


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

4
Я думаю, що ваше ifтвердження по рядку 75 потребує а fi.
Стів

7
Якщо сумніваєтесь, наведіть вар.
koola

9
@koola, "завжди" цитувати вар.
CousinCocaine

Відповіді:


480

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

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

для порівняння значення $aug1з рядком and.

Якщо ви використовуєте [ ... ], вам завжди потрібно пам’ятати про подвійне цитування таких змінних:

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

Якщо ви не цитуєте розширення змінної, а змінна не визначена або порожня, вона зникає з місця злочину, залишаючи лише

if [ = "and" ]; 

що не є правильним синтаксисом. (Також не вдасться отримати інше повідомлення про помилку, якщо в нього $aug1включено пробіл чи метахарактори оболонки.)

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


9
"сучасний"? Хіба [[ завжди був у басі? Він знаходиться в панцирі Korn вже понад двадцять років, і перед датами башти. (Я знаю, що ти маєш на увазі)
cdarke

31

Ви зайняли деякий час, щоб знайти це, але зауважте, що якщо у вас помилка між проміжками, ви також отримаєте таку ж помилку:

[: =: unary operator expected

Правильно:

if [ "$APP_ENV" = "staging" ]

проти

if ["$APP_ENV" = "staging" ]

Як завжди встановлення -xзмінної налагодження допомагає знайти їх:

set -x

Хтось заповів мені цю помилку в сценарії побудови. Врятували мене деякий час, дякую!
Кайл

8

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


0

ти кажеш ...:

elif [$ Operation = "людина"]; тоді якщо [$ aug1 = "додати"]; тоді # <- рядок 75 ехо "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]; тоді відлуння" змінну потрібно заповнити "" або " якщо [! -z $ VARIABLE]; тоді # все в порядку, продовжуйте роботу з рештою сценарію ".


3
[[це не породження двох процесів, це вбудована оболонка (і [це також вбудований Bash). [[відрізняється від того [ [, що трактує другу [як рядок
user123444555621
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.