Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本-将数字与for语句配对_Bash_Shell_Numbers - Fatal编程技术网

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

Bash Shell脚本-将数字与for语句配对,bash,shell,numbers,Bash,Shell,Numbers,我正在尝试制作一个脚本,添加数对,仅使用简单的for/if语句,例如: ./pair 1 2 4 8 16 会导致 ./pair 1 2 4 8 16 32 3 12 48 我当前的脚本是(可能大错特错,我对Shell脚本还不熟悉): 然而,这是行不通的。任何帮助都会很好。我的方法使用cshell。作为一名C程序员,我与cshell的连接更好。但是,我用迭代器来处理这个问题,递增两次 @ i = 1 while ( $i < $#argv ) @ j = $i + 1 @ su

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

./pair 1 2 4 8 16
会导致

./pair 1 2 4 8 16 32
3
12
48
我当前的脚本是(可能大错特错,我对Shell脚本还不熟悉):


然而,这是行不通的。任何帮助都会很好。

我的方法使用cshell。作为一名C程序员,我与cshell的连接更好。但是,我用迭代器来处理这个问题,递增两次

@ i = 1
while ( $i < $#argv )
  @ j = $i + 1
  @ sum = $argv[$i] + $argv[$j]
  echo $sum
  @ i = $i + 2
end
@i=1
而($i<$#argv)
@j=$i+1
@总和=$argv[$i]+$argv[$j]
回音$sum
@i=$i+2
终止

我的方法使用cshell。作为一名C程序员,我与cshell的连接更好。但是,我用迭代器来处理这个问题,递增两次

@ i = 1
while ( $i < $#argv )
  @ j = $i + 1
  @ sum = $argv[$i] + $argv[$j]
  echo $sum
  @ i = $i + 2
end
@i=1
而($i<$#argv)
@j=$i+1
@总和=$argv[$i]+$argv[$j]
回音$sum
@i=$i+2
终止

for循环的
并不是实现这一点的正确工具。使用
while
循环和
shift
命令

while[$#-gt 1];做
echo$($1+2))
班次2
完成

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

if [ $count = 2 ]
此外,您只希望在将其值重置为0之前输出
$sum
,而不是每次通过循环


而且,
expr
不再需要用于算术:
sum=$((sum+a))
a
for
循环并不是用于此的正确工具。使用
while
循环和
shift
命令

while[$#-gt 1];做
echo$($1+2))
班次2
完成

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

if [ $count = 2 ]
此外,您只希望在将其值重置为0之前输出
$sum
,而不是每次通过循环


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

因此shebangs位于bourne shell中,如果您直接启动脚本,它将与执行以下操作相同:

/bin/sh <your_script_name>

它对输入标记进行计数,只要有2个以上(方括号测试),它就会添加第一个标记和第二个标记,以显示结果<代码>移位2
意味着将输入移到两个位置(即,删除$1和$2,并将$n映射到$n-2)。

因此,shebangs位于bourne shell中,如果您直接启动脚本,则与执行以下操作相同:

/bin/sh <your_script_name>
它对输入标记进行计数,只要有2个以上(方括号测试),它就会添加第一个标记和第二个标记,以显示结果<代码>移位2意味着将输入移到两个位置(即,删除$1和$2,并将$n映射到$n-2)


我的方法使用cshell。作为一名C程序员,我与cshell的连接更好。但是,我用迭代器来处理这个问题,迭代器递增两次。

我很久没有看到有人用Csh写文章了。早在Unix早期,就有两个主要shell:Csh和Bourne shell。Bourne是AT&T的风格,BSD(Berkeley标准发行版)使用Csh,它从C语言中获取语法提示

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

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

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

Csh的最后一位大倡导者是史蒂夫·乔布斯。NeXT使用TurboCsh作为其默认外壳,它是MacOSX第一次迭代的默认外壳——很久以前Sun就放弃了它。但是,MacOSX的更高版本默认为BASH

BASH现在是默认的和标准的。正如我前面提到的,在大多数系统上,
/bin/sh
是BASH。BASH手册页中有以下内容:

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

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

我相信汤姆·克里斯蒂安森(Tom Christiansen)的反Csh论文中的大多数批评都不再适用。Turbo C外壳-它在很久以前就取代了原来的C外壳,修复了许多错误。然而,Turbo C是在世界上很多地方放弃了C shell之后出现的,所以我真的不能说

Csh方法很有趣,但不是这个问题的正确答案。C Shell脚本是一种与Bourne Shell完全不同的语言。你会过得更好
#!/bin/sh
printf "%s %s+pc" "$@" | dc
#!/bin/sh
printf "%s %s+pc" "${@/-/_}" | dc