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