Erro "operador unário esperado" no Bash se a condição


225

Eu tenho tentado descobrir o que há de errado com isso, mas simplesmente não consigo descobrir ..

Esta é a parte que parece estar recebendo um erro ..

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

Eu recebo este erro:

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

4
Eu acho que sua ifafirmação na linha 75 precisa de um fi.
31412 Steve

7
Em caso de dúvida, cite vários.
Koola

9
@ koola, 'sempre' cite vários.
CousinCocaine

Respostas:


480

Se você sabe que sempre usará o bash, é muito mais fácil usar sempre o comando composto condicional de suporte duplo [[ ... ]], em vez da versão de suporte único compatível com Posix [ ... ]. Dentro de um [[ ... ]]composto, a divisão de palavras e a expansão do nome do caminho não são aplicadas às palavras; portanto, você pode confiar

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

para comparar o valor de $aug1com a sequência and.

Se você usar [ ... ], sempre lembre-se de colocar aspas variáveis ​​como esta:

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

Se você não citar a expansão da variável e a variável for indefinida ou vazia, ela desaparecerá da cena do crime, deixando apenas

if [ = "and" ]; 

que não é uma sintaxe válida. (Também falharia com uma mensagem de erro diferente se $aug1incluísse espaço em branco ou metacaracteres de shell.)

O [[operador moderno possui muitos outros recursos interessantes, incluindo correspondência de expressão regular.


9
"moderno"? [[ Sempre esteve no bash? Está na casca de Korn há mais de vinte anos e antecede a festança. (Eu sei que você quer dizer embora)
cdarke

31

Demorei um pouco para encontrar isso, mas observe que, se você tiver um erro de espaçamento, também receberá o mesmo erro:

[: =: unary operator expected

Corrigir:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

Como sempre, a configuração da -xvariável de depuração ajuda a encontrar estes:

set -x

Alguém me legou esse bug em um script de construção. Economizou-me algum tempo, obrigado!
Kyle

8

Tente atribuir um valor $aug1antes de usá-lo nas if[]instruções; a mensagem de erro desaparecerá depois.


0

você diz ... :

elif [$ operation = "man"]; então se [$ aug1 = "add"]; então # <- Linha 75 echo "Página de manual para: add" echo "" echo "Sintaxe: add [número 1] [número 2]" echo "" echo "Descrição:" echo "Adicione dois números diferentes." echo "" echo "Info:" echo "Adicionado na v1.0" echo "" elif [-z $ aug1]; então echo "Por favor, especifique um comando para ler a página do manual". else echo "Não há página de manual para esse comando." fi

Eu acho que é apenas o espaço ... faça assim:

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

Você também pode definir um valor padrão para a variável, para não precisar usar dois "[", o que equivale a dois processos ("[" é realmente um programa) em vez de um.

Ele segue esta sintaxe: $ {VARIABLE: -default}.

A coisa toda deve ser pensada de tal maneira que esse valor "padrão" seja algo distinto de um valor / conteúdo "válido".

Se isso não for possível por algum motivo, você provavelmente precisará adicionar uma etapa, como verificar se existe algum valor, como "if [-z $ VARIABLE]; em seguida, ecoar" a variável precisa ser preenchida "" ou " se [! -z $ VARIABLE]; # # tudo estiver bem, continue com o restante do script ".


3
[[não está gerando dois processos, é um shell embutido (e [também um Bash). [[é diferente de [ [, que trata o segundo [como uma string
user123444555621
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.