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ループを試しましたが、正しく機能していないと思います。
これを試して:
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
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ループをシミュレートします。
以下を試すことができます:
#!/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)"
トリッキーなバージョンは次のとおりです。
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桁遅い
典型的な方法:
function summation()
{
sum=0
for((i=m; i<=n; i++))
{
sum=$((sum+i))
}
echo $sum
}
read m n;
summation $m $n