1

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

./pair 1 2 4 8 16

会导致

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

我当前的脚本是(可能大错特错,我是 Shell 脚本的新手):

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

但是,这是行不通的。任何帮助都会很棒。

4

5 回答 5

3

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

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

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

if [ $count = 2 ]

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

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

于 2013-10-29T13:44:49.777 回答
1

我的方法使用 cshell。作为一名 C 程序员,我与 cshell 的联系更好。但除此之外,我使用迭代器来解决问题,递增两次。
macetw

好久没看到有人用Csh写了。在早期的 Unix 时代,有两个主要的 shell:Csh 和 Bourne shell。Bourne 是 AT&T 风格,而 BSD(伯克利标准发行版)使用 Csh,它从 C 语言中获取语法提示。

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

Csh 在 SunOS 时代达到顶峰。SunOS 基于 BSD,Sun 管理员几乎所有的脚本都是用 Csh 编写的。然而,大卫科恩用 Kornshell 改变了很多。Kornshell 包含标准的 Bournshell 语法语言,但包含人们希望在 Csh 中使用的命令别名和 shell 历史编辑等功能。不仅如此,它还包含许多以前从未在 shell 中发现的新功能,例如内置数学(再见exprand bc)、模式匹配[[ ... ]]和 shell 选项可以用set -o.

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

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

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

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

这意味着实体 BASHisms ( shopt, ${foo/re/repl}, 等) 不活跃,但从 Kornshell ( [[ ... ]], set -o, typeset, $(( ... ))) 继承的大部分东西仍然可用。而且,这意味着大约 99% 的 BASH 脚本即使被调用为/bin/sh.

我相信 Tom Christiansen 反 Csh 论文中的大多数批评不再适用。Turbo C shell - 很久以前取代原来的 C shell 修复了许多错误。然而,Turbo C 是在世界上大部分人放弃 C shell 之后出现的,所以我真的不能说。

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

于 2013-10-29T14:58:58.703 回答
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

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

于 2013-10-31T13:37:49.837 回答
0

我的方法使用 cshell。作为一名 C 程序员,我与 cshell 的联系更好。但除此之外,我使用迭代器来解决问题,递增两次。

@ i = 1
while ( $i < $#argv )
  @ j = $i + 1
  @ sum = $argv[$i] + $argv[$j]
  echo $sum
  @ i = $i + 2
end
于 2013-10-29T13:37:08.610 回答
0

所以shebangs inplies 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)。

于 2013-10-29T13:48:33.963 回答