2013-10-21 5 views
11

Ich bin ein Anfänger, Shell-Skripte, so dass ich eine Frage habe. Was mache ich falsch in diesem Code?Integer Ausdruck erwarteten Fehler in Shell-Skript

#!/bin/bash 
echo " Write in your age: " 
read age 
if [ "$age" -le "7"] -o [ "$age" -ge " 65" ] 
then 
echo " You can walk in for free " 
elif [ "$age" -gt "7"] -a [ "$age" -lt "65"] 
then 
echo " You have to pay for ticket " 
fi 

Wenn ich versuche, dieses Skript zu öffnen, es mir für mein Alter fragt und dann heißt es

./bilet.sh: line 6: [: 7]: integer expression expected 
./bilet.sh: line 9: [: missing `]' 

Ich habe keine Ahnung, was ich falsch mache. Wenn mir jemand sagen könnte, wie ich es beheben könnte, wäre ich dankbar, sorry für mein schlechtes Englisch. Ich hoffe, dass ihr mich verstehen könnt.

+0

Sind normalerweise nicht Leerzeichen zwischen den Argumenten eines Befehls vorhanden? Warum hast du es weggelassen? –

Antwort

18

Sie diese Syntax verwenden:

#!/bin/bash 

echo " Write in your age: " 
read age 

if [[ "$age" -le 7 || "$age" -ge 65 ]] ; then 
    echo " You can walk in for free " 
elif [[ "$age" -gt 7 && "$age" -lt 65 ]] ; then 
    echo " You have to pay for ticket " 
fi 
+3

Und wenn ich das tue, bekomme ich 'test.sh: Zeile 3: [[: 109 Test: Syntaxfehler im Ausdruck (Fehler Token ist" Test ")' –

+0

@BradenBest, andere: Ich habe ein ähnliches Problem mit:
while ["$ COUNTER + 1" -lt "$ array_length"]; tun
Es gibt mir: Kann mir bitte jemand helfen. –

7

Wenn Sie -o (oder -a) verwenden, muss es in den Klammern des test Befehl sein:

if [ "$age" -le "7" -o "$age" -ge " 65" ] 

jedoch ihre Verwendung ist veraltet, und Sie sollten separate test-Befehle verwenden, die durch || (oder &&) stattdessen verbunden werden:

if [ "$age" -le "7" ] || [ "$age" -ge " 65" ] 

Stellen Sie sicher, dass den schließenden Klammern Leerzeichen vorangestellt sind, da es sich um technische Argumente für [ handelt, nicht einfach um Syntax.

In bash und einigen anderen Shells können Sie den übergeordneten [[ Ausdruck wie in kamituel's answer gezeigt verwenden. Dies funktioniert in jeder POSIX-konformen Shell.

+0

Ja, Shebang betrachtend, gehe ich davon aus, dass OP 'bash' verwendet. Gut, wenn Sie auf POSIX-Lösung zeigen, +1. – kamituel

2
./bilet.sh: line 6: [: 7]: integer expression expected 

Seien Sie vorsichtig mit " "

./bilet.sh: line 9: [: missing `]' 

Dies ist, weil Sie Raum zwischen Klammern haben müssen wie:

if [ "$age" -le 7 ] -o [ "$age" -ge 65 ] 

Blick: mehr Platz, und kein " "

0

Try dies:

If [ $a -lt 4 ] || [ $a -gt 64 ] ; then \n 
    Something something \n 
elif [ $a -gt 4 ] || [ $a -lt 64 ] ; then \n 
    Something something \n 
else \n 
    Yes it works for me :) \n 
+0

Es funktioniert für mich nicht Combian verwenden oder nicht -o -a Diese funktionieren nicht für mich – Harry1992

1

Dieser Fehler kann auch auftreten, wenn die Variable, die Sie vergleichen, ausgeblendete Zeichen enthält, die keine Ziffern/Ziffern sind.

Zum Beispiel, wenn Sie eine ganze Zahl von einem Dritt Skript abrufen, müssen Sie sicherzustellen, dass die zurückgegebenen String nicht hidden characters enthält, wie „\ r“ oder „\ n“.

Zum Beispiel:

#!/bin/bash 

# Simulate a string returned from a script, which is "1234\r" 
a='1234 
' 

if [ "$a" -gt 1233 ] ; then 
    echo "number is bigger" 
else 
    echo "number is smaller" 
fi 

Diese : integer expression expected in einem Skriptfehler führen wird, weil $a ein nicht-stellige Zeichen enthält "\ r".Sie haben diesen Charakter entfernen hier die Anweisungen mit: How to remove carriage return from a string in Bash

So etwas wie folgt verwenden:

#!/bin/bash 

# Simulate a string returned from a script, which is "1234\r" 
a='1234 
' 

# Remove all new line, carriage return, tab characters 
# from the string, to allow integer comparison 
a="${a//[$'\t\r\n ']}" 

if [ "$a" -gt 1233 ] ; then 
    echo "number is bigger" 
else 
    echo "number is smaller" 
fi 

Sie auch set -xv können Ihre Bash-Skript und offenbaren diese versteckten Zeichen debuggen. Siehe https://www.linuxquestions.org/questions/linux-newbie-8/bash-script-error-integer-expression-expected-934465/