web-dev-qa-db-ja.com

Linuxbash。 forループと関数、数値の追加用

Linuxでbashスクリプトを学んでいて、簡単だと思っていた1つの問題を解決したかったのですが、理解できませんでした。

たとえば、パラメータとして数値を挿入したいと思います。

sh script.sh 5

そして、5(1 + 2 + 3 + 4 + 5)= 15を挿入すると、結果15が得られます。

関数で解きたいです。

n=$1
result=0
j=0

ADD(){
    result=`expr $result + $j`
}

#for (( i=1; i<=$n; i++ ))
for i in {0..$n..1}
do 
    ADD
    j=`expr $j + $1`
done 

echo $result

番号を追加したいときはいつでも、追加する関数を呼び出したいです。私が正しく想像したかどうかさえわかりません。そして、forループの使い方がわかりません。 2つの異なるforループを試しましたが、正しく機能していないと思います。

8
user3127680

これを試して:

n=$1

sum=0
for i in `seq 1 $n` ; do
    ## redefine variable 'sum' after each iteration of for-loop
    sum=`expr $sum + $i`
done

echo $sum
13
csiu

Whileループを使用し、コードに似ています。

#!/bin/bash

n=$(expr $1 + 1)
result=0
j=0

add(){
    result=$(expr $result + $j)
}

while test $j -ne $n
do
    add
    j=$(expr $j + 1)
done

echo $result

$(.. whatever ..)は `..whatever ..`に似ており、コマンドを実行して値を返します。テストコマンドは非常に便利です。男性をチェックしてください。この場合、条件$ j -ne $ n(jはnと等しくない)を比較し、ループの各ターンでjvarに1を追加するforループをシミュレートします。

2
LoboSolitario

以下を試すことができます:

#!/usr/bin/env bash

sumit() {
    local n=$1
    local sum=0
    for (( i=0;i<=n;i++ )) ; do
        (( sum = sum + i ))
    done

    echo "$sum"
}

sum=$(sumit $1)
echo "sum is ($sum)"
1
Timmah

トリッキーなバージョンは次のとおりです。

sum_to () ( 
    set -- $(seq $1)
    IFS=+
    echo "$*" | bc
)

sum=$(sum_to 5)
echo $sum         # => 15

ただし、多数の場合は非常に遅くなります。

$ time sum_to 1000000
500000500000

real    0m2.545s
user    0m2.513s
sys 0m0.189s

もっと効率的な

$ sum_to_2 () { { seq $1 | tr '\n' '+'; echo 0; } | bc; }
$ time sum_to_2 1000000
500000500000

real    0m0.727s
user    0m0.981s
sys 0m0.037s

より良い:

$ sum_to_3 () { Perl -le '$n=$ARGV[0]; $sum += $n-- while $n; print $sum' $1; }
$ time sum_to_3 1000000
500000500000

real    0m0.075s
user    0m0.071s
sys 0m0.002s

さらに悪いこと:番号ごとに「外部」プログラムを呼び出す

$ sum_to_slow () { 
    sum=0
    for i in $(seq $1); do
        sum=$(expr $sum + $i)
    done
    echo $sum
}
$ date; time sum_to_slow 1000000; date
Mon Mar 17 14:00:53 EDT 2014
^C
$ date
Mon Mar 17 14:07:01 EDT 2014

数分後にCtrl-Cを押しても、答えが見えません。少なくともbashで算術演算を行う

$ sum_to_slow_improved () { sum=0; for i in $(seq $1); do (( sum += i )); done; echo $sum; }
$ time sum_to_slow_improved 1000000
500000500000

real    0m4.937s
user    0m4.869s
sys 0m0.124s

それでもPerlバージョンより2桁遅い

0
glenn jackman

典型的な方法:

function summation()
{
    sum=0
    for((i=m; i<=n; i++))
    {
      sum=$((sum+i)) 
    }
    echo $sum
}

read m n;
summation $m $n
0
rashedcs