我正在尝试制作一个添加数字对的脚本,仅使用简单的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
然而这不起作用。任何帮助都会很棒。
答案 0 :(得分:3)
for
循环不是真正适合的工具。使用while
循环和shift
命令。
while [ $# -gt 1 ]; do
echo $(( $1 + $2 ))
shift 2
done
您的脚本中的问题是您的if
语句中没有足够的空格,并且变量名称前面没有$
:
if [ $count = 2 ]
此外,您只想在将其值重置为0之前输出$sum
,而不是每次都通过循环输出。{/ p>
而且,算术不再需要expr
:sum=$(( 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中找到过的新功能,例如内置数学(告别expr
和bc
),模式匹配[[ ... ]]
和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
我刚才意识到这是最简短的答案!