2つの数字を入力して、これら2つの数字の間のすべての整数の合計を求めたいと思います。
たとえば、
./sum1 2 5
生産しなければならない
sum: 14
なぜなら2+3+4+5=14だからです。
これが私が今まで持っているものです:
read num1 num2
for (( i=$num1; i<=$num2; i++))
do
now how to do what i want
done
echo "The Sum of your two number and the numbers inbetween is:$i"
そこに他の変数を追加する必要があるようですが、良い解決策が見つからないようです。
答え1
コマンドがある場合は、seq
無差別アプローチを使用できます。
$ seq 2 5 | paste -sd + - | bc
14
だから関数として:
sum() { seq "$@" | paste -sd + - | bc; }
よりスマートな方法:
sum() { echo "$((($1+$2)*($2-$1+1)/2))"; }
またはbc
得られた正確さ:
sum() { echo "($1+$2)*($2-$1+1)/2" | bc; }
アイデアは、以下を計算することです。
2+3+4+5
倍にすると、次のように書くことができます。
2+3+4+5
+5+4+3+2
───────
7+7+7+7
したがって、2倍()の合計は2 * s
4(b - a + 1
)倍7
(a + b
)です。
2 * s = (b - a + 1) * (a + b)
だから
s = (b - a + 1) * (a + b) / 2
答え2
探す「算術評価」シェル文書から。たとえば、BASHでは次のようになります。
n=0
for (( i = $num1; i <= $num2; i++)); do
(( n += i ))
done
echo $n
通常、頻繁に使用する予定の場合は、スタンドアロンスクリプトではなく関数として使用することをお勧めします。算術評価を提供する一部のシェルでは、(( n = n + i ))
短縮+=
演算子を使用できない可能性があるため、これを使用する方が適切です。
答え3
なぜ自転車に乗るのですか?
read x y
echo $(( (y - x) * (y - x + 1) / 2 + (y - x + 1) * x ))
純粋なシェルでは、以下が必要です。$(( ))