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