Linux bash。 for loop和function,用于添加数字

时间:2014-03-17 16:46:02

标签: linux bash function for-loop

我在Linux中学习bash脚本,我想解决一个我认为很容易但我无法解决的问题。

我想插入数字作为参数,例如:

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循环,我认为它们无法正常工作。

5 个答案:

答案 0 :(得分:11)

试试这个:

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

答案 1 :(得分:2)

使用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..`,它执行你的命令并返回值。测试命令非常有用,请查看该人。在这种情况下,模拟一个for循环,比较条件$ j -ne $ n(j不等于n)并在循环的每个回合中将j加1。

答案 2 :(得分:1)

你可以尝试下面的内容:

#!/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)"

答案 3 :(得分:0)

这是一个棘手的版本:​​

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

Worser:调用&#34;外部&#34;每个号码的程序

$ 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个数量级

答案 4 :(得分:0)

典型方式:

this.toggle = false