Shell脚本 - 将数字与for语句配对

时间:2013-10-29 13:33:33

标签: bash shell numbers

我正在尝试制作一个添加数字对的脚本,仅使用简单的for / if语句,例如:

./pair 1 2 4 8 16

会导致

./pair 1 2 4 8 16 32
3
12
48

我当前的脚本是(可能非常错误,我是Shell Scripting的新手):

#!/bin/sh

sum=0
count=0

for a in $*
do
    sum=`expr $sum + $a`
    count=`expr $count + 1`

    if [ count=2 ]
        then
        sum=0
        count=0
    fi

    echo "$sum"

done

exit 

然而这不起作用。任何帮助都会很棒。

5 个答案:

答案 0 :(得分:3)

for循环不是真正适合的工具。使用while循环和shift命令。

while [ $# -gt 1 ]; do
    echo $(( $1 + $2 ))
    shift 2
done

您的脚本中的问题是您的if语句中没有足够的空格,并且变量名称前面没有$

if [ $count = 2 ]

此外,您只想在将其值重置为0之前输出$sum,而不是每次都通过循环输出。{/ p>

而且,算术不再需要exprsum=$(( sum + a ))

答案 1 :(得分:1)

  

我的方法使用cshell。作为C程序员,我用cshell更好地连接。但是,这有助于我用迭代器解决问题,增加两次   macetw

我很久没见过有人在Csh上写过了。早在Unix时代,就有两个主要的shell:Csh和Bourne shell。 Bourne是AT& T的味道,BSD(Berkeley标准发行版)使用了Csh,它从C语言中获取了语法提示。

我认识的大多数人都使用Csh作为他们的标准shell,但是在Bourne shell中编写了脚本,因为Csh有Tom Christiansen所指出的各种问题(正如Olivier Dulac已经提到的那样)。但是,Csh具有命令别名和命令行历史记录和编辑。人们在命令行shell中想要的功能。

Csh在SunOS时代达到顶峰。 SunOS基于BSD,Sun管理员几乎用Csh编写了所有脚本。然而,David Korn用Kornshell改变了很多。 Kornshell包含标准的Bournshell语法语言,但包含人们在Csh中想要的命令别名和shell历史编辑等功能。不仅如此,它还包含许多以前从未在shell中找到过的新功能,例如内置数学(告别exprbc),模式匹配[[ ... ]]和shell选项可以使用set -o设置。

现在,根本不需要了解Csh。您可以将Kornshell用作脚本语言和命令行shell。当Sun用Solaris取代SunOS时,Kornshell而不是C shell是默认的shell。这是C shell作为可行shell选择的结束。

Csh的最后一位大倡导者是史蒂夫乔布斯。 NeXT使用TurboCsh作为其默认shell,它是Mac OS X第一次迭代时的默认shell - 很久以后Sun放弃了它。但是,Mac OS X的更高版本默认为BASH。

BASH现在是默认和标准。正如我之前提到的,在大多数系统上,/bin/sh BASH 。在BASH手册页中是这样的:

  

如果使用名称sh调用bash,它会尝试尽可能接近地模仿sh的历史版本的启动行为, 同时符合POSIX标准

这意味着固体BASHisms(shopt${foo/re/repl}等)不活跃,但大部分内容都来自Kornshell([[ ... ]]set -o,{ {1}},typeset)仍可用。并且,这意味着即使调用$(( ... )),大约99%的BASH脚本仍然可以工作。

我相信Tom Christiansen反Csh论文中的大部分批评都不再适用。 Turbo C shell - 很久以前取代原来的C shell修复了很多bug。但是,Turbo C在世界上大部分时间都放弃了C shell,所以我实在说不出来。

Csh方法很有意思,但不是这个问题的正确答案。 C Shell脚本是一种与Bourne shell完全不同的语言。你最好用Python来回答。

答案 2 :(得分:0)

我的方法使用cshell。作为C程序员,我用cshell更好地连接。但是,这有助于我用迭代器解决问题,增加两次。

@ i = 1
while ( $i < $#argv )
  @ j = $i + 1
  @ sum = $argv[$i] + $argv[$j]
  echo $sum
  @ i = $i + 2
end

答案 3 :(得分:0)

所以shebangs会使用bourne shell,如果你直接启动脚本,它将与执行相同:

/bin/sh <your_script_name>

我能想到的最简单的循环就是这个:

while [ $# -gt 1 ]; do
  expr $1 + $2
  shift 2
done

它计算输入令牌,只要你有2个以上(方括号测试),它就会添加显示结果的第一个和第二个。 shift 2表示将输入的两个位置移位(即丢弃$ 1和$ 2,$ n将映射到$ n-2)。

答案 4 :(得分:0)

如果您想要一个有趣的sh / bc组合解决方案:

#!/bin/sh
printf "%s+%s\n" "$@" | bc

很酷,printf负责循环本身。 :)

当然,没有任何错误检查!它也适用于花车。

dc相同:

#!/bin/sh
printf "%s %s+pc" "$@" | dc

但它不适用于负数。对于负数,您可以:

#!/bin/sh
printf "%s %s+pc" "${@/-/_}" | dc

我刚才意识到这是最简短的答案!