2016-11-22 3 views
4

Ich habe eine if Linie in meinem Shell-Skript, das wie folgt aussieht:Warum sagt der Test unerwartete Klammern?

if [ 0 -lt 2 -o (0 -gt 3) ] 

und das gibt den Fehler:

line 3: syntax error near unexpected token `(' 

So schaute ich auf man test sicher sein, dass Pars unterstützt wurde, und Ganz klar, ganz oben auf der Manpage sind sie! Was gibt!?

Das obige Beispiel stimmt nicht genau mit dem Code überein, weil ich versucht habe, es zu bereinigen, um einen Punkt zu beweisen, aber das ist my repo, wenn Sie Kontext benötigen.

BEARBEITEN: Die if-Zeile wurde geändert, um dem Fehler zu entsprechen.

+1

FYI, das ist ein Fehler, der http://www.shellcheck.net/ automatisch erkennen kann. –

Antwort

5

Die Klammern werden an den test Befehl übergeben als Argumente. Der Ausdruck [ ... ] ist nur eine andere Möglichkeit, den Befehl test einzugeben. Der einzige Unterschied besteht darin, dass das letzte Argument für den Befehl [] sein muss.

So sollten Sie die Klammer entkommen wie alle anderen Argumente, die Sie auf einen Befehl übergeben Sie die Interpretation durch die Shell zu vermeiden:

if [ \($# -lt 2 \) -o \($# -gt 3 \) ] 

Alternativ verwenden Sie einfache Anführungszeichen:

if [ '(' $# -lt 2 ')' -o '(' $# -gt 3 ')' ] 

Von der Infoseite:

`test' 
`[' 
      test EXPR 

    Evaluate a conditional express ion EXPR and return a status of 0 
    (true) or 1 (false). Each operator and operand must be a separate 
    argument. 

Durch die Art und Weise könnte der Ausdruck wie folgt geschrieben werden:

if builtin test \($# -lt 2 \) -o \($# -gt 3 \) 
+1

+1 Kann nützlich sein, um anzugeben, dass die POSIX (~ UNIX) Spezifikation die Anzahl der Argumente auf 4 begrenzt (Suche nach> 4) in: [Ein wenig über diesem Link] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128_06) – sorontar

+0

Auch erwähnenswert (von der gleichen verlinkten Seite): Die XSI-Erweiterungen, die die binären Primärzeichen "-a" und "-o" und die "(" und ") Operatoren angeben, wurden als veraltet markiert. (Viele Ausdrücke, die sie verwenden, sind mehrdeutig durch die Grammatik in Abhängigkeit von den bestimmten auszuwertenden Ausdrücken definiert) .) ". Es wird empfohlen, separate 'test' /' ['-Anweisungen zu verwenden und sie mit' && '/' || 'zu kombinieren. – mklement0

3

Sie haben unnötige (...) innerhalb [ ... ], die entspringt und nicht quoted verursacht Syntaxfehler.

können Sie diese stattdessen verwenden:

[[ $# -lt 2 || $# -gt 3 ]] 

Oder Gebrauch:

[[ $# -lt 2 ]] || [[ $# -gt 3 ]] 
+0

interessant, ich dachte, es war wegen der Zitate, aber ich denke, dieser Ausdruck '$ # -lt 2' würde immer etwas zurückgeben - entweder' 0' oder '1', so dass es kein Zitat Problem ist. Also ich denke du hast Recht. –

+1

Aber beachte auch, dass die Shell '[[] anders als' ['' behandelt. Unter anderen Unterschieden ermöglicht es die Verwendung von nicht umrandeten Klammern. Also könnte der Fragesteller tatsächlich nur seine "[...]" in "[[...]]" ändern und seine Klammern behalten. –

+0

ja, obwohl sie hier nicht notwendig sind, erhöhen Parens '(...)' die Präzedenz für einen bedingten Ausdruck in einer Shell - also, pro rob mayoff Kommentare, die '[[...Die]] -Syntax würde eine besser lesbare Verwendung von Parens in Bedingungen ermöglichen. –

3

Obwohl diese Lösung nicht direkt die Frage nicht beantworten, aber hier ist eine alternative Art und Weise, die C-Stil arithmetic expressions verwendet, die wirksam ist, wenn Sie mit Zahlen zu tun haben in bash

#!/bin/bash 

if (("$#" < 2 || "$#" > 3)); then 
+3

Dies beantwortet nicht "Warum fragt Test unerwartete Klammern?" Frage überhaupt. Wenn Sie eine vorhandene Antwort ergänzen möchten, geben Sie einen Kommentar dazu ein. –

+1

@MarcinOrlowski: stimme völlig mit dir überein, wollte den Punkt betonen, wenn der Autor diese Art des Vergleichs hätte verwenden können, wäre er nicht mit diesem Fehler an erster Stelle gelandet. Gedanke, der eine richtige Antwort verdient hätte. – Inian

+1

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/14366915) –

Verwandte Themen