web-dev-qa-db-ja.com

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

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

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 + ...であり、加算の算術演算の結果ではありません。

29
curious

算術評価の構文が間違っています。次のいずれかを使用します(1つ目は非常に移植可能ですが低速です。2つ目はPOSIXであり、ボーンシェルと以前のバージョンのAlmquistシェルを除いて移植可能です。最後の3つは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/*
54
manatwork

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

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

およびそこにあることを確認IS「$ a + $ num」内の両方の側のスペース

7
user1678213

最初に変数の型を宣言できます:

    declare -i a=0
    declare -i num=0
2
Dr_Hope

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

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

@manatworkにリストされている他の可能性は、ボーンでも有効である可能性がありますシェル(bash

1
loved.by.Jesus

以前の編集は別の投稿用でした。ここでは、元のスクリプトを少し変更しただけです。

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