2016-09-29 6 views
0

:今bash関数で変数を宣言しますか?私は、この持っている(BASH)

sum() for i in [email protected]; do ((tot += 4)); echo $tot;done 

を、どのように私は、forループの前にTOT変数をリセットするのですか?

私が試した:

sum() tot = 0; for i in [email protected]; do ((tot += 4)); echo $tot;done 

sum() tot = 0;done; for i in [email protected]; do ((tot += 4)); echo $tot;done 

sum() tot = 0 for i in [email protected]; do ((tot += 4)); echo $tot;done 

sum() ((tot = 0)) for i in [email protected]; do ((tot += 4)); echo $tot;done 

答えて

2

関数定義では、1つの複合コマンドが本体として必要です。あなたのforループは、単一の複合コマンドということですので、これは

sum() for i in [email protected]; do ((tot += 4)); echo $tot;done 

合法です。 に別のコマンド(この場合はtotへの割り当て)を追加しようとすると、そのコマンドとforループの両方がの別の複合コマンドに結合されていることを確認する必要があります。

関数を定義する通常の方法は、中括弧グループ内の唯一のコマンドが別の複合コマンドであっても、常に中括弧グループを使用することです(特定の状況では、サブシェル(...))。ここでは、ブレース・グループを使用すると、関数の本体に、あなたの代入文を追加することができます:単一代入文は、有効な関数本体ではありませんので、

sum() { 
    tot=0 
    for i in "[email protected]"; do ((tot += 4)); echo "$tot"; done 
} 

あなたの最初の二つの試みはエラーです。

複合コマンド(単純コマンドとは異なります)の前に変数を割り当てることができないため、3回目の試行はエラーです。

あなたの4番目の試みは構文的に合法です。関数sumを定義し、値totを0に設定します。forループは、関数が定義された後、関数定義の一部ではなく実行されます。

2

をあなたがlocalキーワードで関数のローカル変数totを行う必要があります。ローカル変数を定義するときに、あなたが設定することもでき

sum() { local tot; for i in [email protected]; do ((tot += 4)); echo $tot;done; } 

、必要に応じて、初期値:

sum() { local tot=0; for i in [email protected]; do ((tot += 4)); echo $tot;done; } 

ただし、ここではオプションです。

+0

'tot'をローカル変数にするのは良い考えですが、実際には元の問題を解決するわけではありません。代入と 'for'ループがすべて単一の複合コマンドの一部であることを保証します(' {...} 'の中にあります)。 – chepner

+0

'i'変数もローカルにすることもできます。 –

関連する問題