スクリプトに算術変数を追加する方法


26

フォルダーに含まれる多数のファイルの行サイズを累積したい。次のスクリプトを作成しました。

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

スクリプトの最後にあるのは123 + 234 + 432 + ...であり、加算の算術演算の結果ではありません。

回答:


50

算術評価の構文が間違っています。次のいずれかを使用します(1つ目は非常に移植性があり遅いですが、2つ目はBourneシェルとそれ以前のバージョンのAlmquistシェルを除くPOSIXであり、最後の3つはrequire kshbashまたはですzsh)。

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

または、forループ全体をスキップして、次の操作を実行できます。

wc -l folder/*

または、合計のみが必要な場合:

cat folder/* | wc -l

または、zshとそのmult_iosオプションを使用して:

wc -l < folder/*

$内部は不要です((...))a=$((a+num))すでに大丈夫です。
ウェイジュン周

変数が設定されていない場合、またはヌル値を持っている場合、それを処理する他の方法がなければ、これは機能します。
バーラト

7

このコードを使用することもできます

    a=`expr $a + $num`
    echo $a

そして、「$ a + $ num」の+の両側にスペースがあることを確認します。


計算にexprコマンドを使用するときは、常に演算子の両側にスペースを入れてください。
-user1678213

2

最初に変数のタイプを宣言できます。

    declare -i a=0
    declare -i num=0

1

申し訳ありませんが、以前の編集は別の投稿のものでした。ここでは、元のスクリプトを少し変更しただけです。

a = 0としましょう
num = 0とする
for iフォルダー/ *
行う
        num = `cat $ i | wc -l`
        a = $(echo $ a + $ num | bc)
やった
エコー$ a

1
回答が質問に対応していないようであるため、投票は拒否されました。
Time4Tea

申し訳ありませんが、修正済み
レオ

1

答えは、コードが有効なシェルを指定する必要があります。たとえば、bourne Shell(sh)では、次の指示のみが有効です。

a=$((a+num))
a=$(($a+$num))

一方、@ manatworkによってリストされる他の可能性は、bourne again shell(bash)で有効かもしれません


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.