簡體   English   中英

Linux bash。 for loop和function,用於添加數字

[英]Linux bash. for loop and function, for adding numbers

我正在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循環。 我已經嘗試了兩種不同的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..`,它執行你的命令並返回值。 測試命令非常有用,請查看該人。 在這種情況下,模擬for循環,比較條件$ j -ne $ n(j不等於n)並在循環的每個回合中將j加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)"

這是一個棘手的版本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM