【问题标题】:Linux bash. for loop and function, for adding numbersLinux 重击。 for 循环和函数,用于添加数字
【发布时间】:2014-04-23 00:09:24
【问题描述】:

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

【问题讨论】:

  • 使用j=$(( $j + $i )); expr 仅在不支持 POSIX 算术表达式语法的非常旧的 shell 中才需要。
  • 这部分是错误的:{0..$n..1} -- bash 在变量扩展之前进行大括号扩展,因此您不能将变量放在这样的范围内(不要乱用 eval)。

标签: linux bash function for-loop


【解决方案1】:

试试这个:

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

【讨论】:

  • 谢谢你,你的想法对我帮助很大。我只是重新安排了一些功能。
  • 你能给我解释一下这是做什么的 -> seq 1 $n ?
  • seq 打印一个数字序列,所以seq 1 $n 将打印1 2 ... n,其中n 在您运行script.sh时被定义为5 >
  • seq 是必需的,因为bash 在参数扩展之前处理大括号扩展,因此{...} 必须只包含数字文字。
【解决方案2】:

你可以试试下面的:

#!/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】:

    带有一个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..`,它执行你的命令并返回值。 test 命令非常有用,请查看 man。在这种情况下,模拟了一个 for 循环,比较条件 $j -ne $n (j not equal n) 并在循环的每一轮中将 j var 加 1。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        一种典型的方式:

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

        【讨论】:

          猜你喜欢
          • 2017-07-14
          • 2012-01-23
          • 1970-01-01
          • 1970-01-01
          • 2013-02-28
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          相关资源
          最近更新 更多