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
if
afirmação na linha 75 precisa de umfi
.Respostas:
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 confiarpara comparar o valor de
$aug1
com a sequênciaand
.Se você usar
[ ... ]
, sempre lembre-se de colocar aspas variáveis como esta: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
que não é uma sintaxe válida. (Também falharia com uma mensagem de erro diferente se
$aug1
incluísse espaço em branco ou metacaracteres de shell.)O
[[
operador moderno possui muitos outros recursos interessantes, incluindo correspondência de expressão regular.fonte
Demorei um pouco para encontrar isso, mas observe que, se você tiver um erro de espaçamento, também receberá o mesmo erro:
Corrigir:
vs
Como sempre, a configuração da
-x
variável de depuração ajuda a encontrar estes:fonte
Tente atribuir um valor
$aug1
antes de usá-lo nasif[]
instruções; a mensagem de erro desaparecerá depois.fonte
você diz ... :
Eu acho que é apenas o espaço ... faça assim:
fonte
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 ".
fonte
[[
não está gerando dois processos, é um shell embutido (e[
também um Bash).[[
é diferente de[ [
, que trata o segundo[
como uma string