2016-05-25 14 views
0

Ich versuche, eine multiple Tabelle mit einer for-Schleife zu erstellen, aber ich weiß nicht, wie die Variablen initialisiert werden und ob die gelesene Variable identisch sein muss in der for-Schleifebei der Suche nach passender Zeile 27: Syntaxfehler: unerwartetes Ende der Datei

Syntax: 
#!/bin/bash 
#multiplication table 
#$#=parameter given to the script 
#$i=variable in for loop 
#$1=variable represents a valid number not zero 
#$0=variable represents bash script name 

echo "Enter number you want to multiply" 
read varnumber 
echo "This number: $varnumber has this multiplication result: 

if [ $varnumber -eq 0 ] 
then 
echo "Error - Number missing from command line argument" 
echo "Syntax : $0 number" 
echo "Use to print multiplication table for a given number" 
exit 1 
fi 

n=$varnumber 
for i in 1 2 3 4 5 6 7 8 9 10 
do 
echo "$varnumber * $i = `expr $i \* $varnumber`" 
+2

Test zunächst bei http://shellcheck.net. Viel Glück. (Sie müssen mindestens auf der 'for ... do ...' -Schleife ein '' done''-Ende machen. – shellter

+0

Jede for-Schleife muss mit "done" enden, das ist wie ein schließendes Tag für die Schleife –

+0

Danke Jungs! Shellcheck.net prüft auf Syntaxfehler für einen bestimmten Code? –

Antwort

3

Eine for-Schleife sollte getan beenden, so:

for i in 1 2 3 4 5 6 7 8 9 10 
do 
echo "$varnumber * $i = `expr $i \* $varnumber`" 
done #line added 

auch gibt es keinen Schaden tun:

n="$varnumber" 

und beachten Sie, dass Backticks (``) in bash nicht bevorzugt ist. Verwenden Sie stattdessen den Befehl $() Format für this Grund. Also:

echo "$varnumber * $i = $(expr $i \* $varnumber)" # Used $() syntax. 

Siehe, was ist obsolete in bash.

In der Tat, viel besser, wenn Sie den Job ohne expr beenden können, die ein externer Befehl ist:

echo "$varnumber * $i = $((i * varnumber))" # Faster than the previous version 

(Danke @ benjamin-w für diesen Vorschlag)

+1

Seltsamerweise ist die rechte Seite einer Zuweisung eine Stelle, an der Sie eigentlich keine doppelten Anführungszeichen um eine Parametererweiterung benötigen: Weder die Dateinamenerweiterung noch die Wortaufteilung wird am Ergebnis ausgeführt. (Obwohl es wahrscheinlich am einfachsten ist, eine Richtlinie von * immer * zu haben, die Parametererweiterungen in doppelte Anführungszeichen setzt.) – ruakh

+1

@ruakh: Aber es gibt Ausnahmefälle. Siehe [diese Antwort] (http://stackoverflow.com/a/37341022/6379160) und die folgenden Kommentare. Wenn Sie sich nicht so sicher sind, ist es immer gut, Variablen mit doppelten Anführungszeichen zu umgeben. –

+1

'expr' ist ein externer Befehl, warum nicht einfach arithmetische Expansion verwenden? 'echo" $ varnumber * $ i = $ ((i * varnumber)) "'? –

0

Ein einfacherer Bash-Skript zu Sie geht die darüber wie:

#!/bin/bash 

echo "Enter the number for which the multiplication table is desired." 
read varname 

if [ $varname -eq 0 ]; 
then 
    echo "Error!! The multiplication of anything with 0 results to 0." 
    exit 130  # Exit with CTRL + C 
fi 

for ((i=1; i<=10; i++)); # You can change 10 into any other number 
         # according to your requirement. 
         # Or substitute it with a variable (say N) 
         # which can be prompted to the user. 
do 
    product=$(expr $i \* $varname) # Or use: `expr $i \* $varname` 
    echo "$varname times $i = $product" 
done 

die Ausgabe wird wie folgt aussehen:

"Enter the number for which the multiplication table is desired." 

Wenn ich 5 eingeben, wenn Sie dazu aufgefordert, wird folgendes ausgedruckt:

5 times 1 = 5 
5 times 2 = 10 
5 times 3 = 15 
5 times 4 = 20 
5 times 5 = 25 
5 times 6 = 30 
5 times 7 = 35 
5 times 8 = 40 
5 times 9 = 45 
5 times 10 = 50 
+0

Danke für Ihre Antwort! Ich werde es auf diese Weise versuchen –

Verwandte Themen