2016-05-25 4 views
0

forループを使用して乗算表を作成しようとしていますが、変数を初期化する方法と読み込み変数が同じである必要があるループ一致する行を探している間27:構文エラー:予期しないファイルの末尾

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

テストを最初http://shellcheck.netで。がんばろう。 (少なくともfor ... do ...ループで 'done'を閉じる必要があります)。 – shellter

+0

すべてのforループは、ループの終了タグのような "done"で終わる必要があります –

+0

ありがとう! Shellcheck.netは、特定のコードの構文エラーをチェックしますか? –

答えて

3

Aのためのforループでは、そう、完了で終了する必要があります

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

はまたやっても害はありません。

n="$varnumber" 

とバッククォート( ``)はbashでは好まれません。 thisの理由の代わりに、コマンド$()を使用してください。したがって:

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

obsolete in bashを参照してください。

実際には、外部コマンドであるexprのないあなたが仕事を終えることができればよりよい:

+1

奇妙なことに、割り当ての右辺は、実際にはパラメータ拡張の前後に二重引用符を必要としない1つの場所です。ファイル名拡張も単語分割も結果に対して実行されません。 (おそらく、パラメータ展開を二重引用符で囲むという方針をとるのはもっとも簡単ですが) – ruakh

+1

@ruakh:例外的なケースがあります。 [この回答](http://stackoverflow.com/a/37341022/6379160)とそれに続くコメントを参照してください。あなたが確信が持てない限り、変数を二重引用符で囲むことは常に良いことです。 –

+1

'expr'は外部コマンドです。なぜ算術展開を使用しないのですか? 'echo" $ varnumber * $ i = $((i * varnumber)) "'? –

0

Aはるかに簡単なbashスクリプトに(この提案のための-Wベンジャミン@感謝)

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

上記のようになります:

#!/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 

出力は次のようになります。

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

私は5を入力するとプロンプトが表示されたら、次のように印刷されます。

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

お返事ありがとうございます!私はこれを試してみる –

関連する問題