0

我要做的是列出用户通过 KornShell (ksh) 脚本输入的两个数字之间的所有偶数。因此,如果用户输入第一个数字,那么它将显示2第二个数字25

2,4,6,8,10,12,14,16,18,20,22,24
4

6 回答 6

2

这应该与ksh93and一起使用bash,不需要seqperl可能不会安装,具体取决于所使用的操作系统。

function evens {
  for((i=($1+($1%2));i<($2-3);i+=2));do printf "%s," $i;done
  echo $((i+2))
}

$ evens 2 25
2,4,6,8,10,12,14,16,18,20,24
$ evens 3 24
4,6,8,10,12,14,16,18,20,24
$ evens 0 9
0,2,4,8
于 2013-03-24T00:09:44.947 回答
2

在 ksh 中,假设您使用了变量startend

set -A evens                             # use an array to store the numbers
n=0
i=$start
(( i % 2 == 1 )) && (( i+=1 ))    # start at an even number
while (( i <= end )); do
  evens[n]=$i
  (( n+=1 ))
  (( i+=2 ))
done
IFS=,  
echo "${evens[*]}"                       # output comma separated string

输出

2,4,6,8,10,12,14,16,18,20,22,24
于 2013-03-23T22:58:12.277 回答
2
first=2 # from user
last=25 # from user
seq $first 2 $last
于 2013-03-23T22:20:13.530 回答
1

在 shell 中有很多方法可以做到这一点shell script,, awk,seq等等......

既然你用 标记了问题vi,我用vim添加了一个:

fun! GetEven(f,t)
    let ff=a:f%2?a:f+1:a:f
    echom join(range(ff,a:t,2),",")
endf

获取该函数,然后键入,:call GetEven(2,25)您将看到预期的输出。

它目前在命令区域回显,如果您希望它显示在文件中,只需使用putor setline,也很容易。

于 2013-03-23T23:52:15.090 回答
0

使用perl

perl -e 'print join q{,}, grep { $_ % 2 == 0 } (shift .. shift)' 2 25

它产生:

2,4,6,8,10,12,14,16,18,20,22,24

编辑以修复尾随换行符:

perl -e 'print join( q{,}, grep { $_ % 2 == 0 } (shift .. shift) ), "\n"' 2 25
于 2013-03-23T22:25:22.347 回答
0

通过设置first=$(($1+($1%2)))和使用-s选项来格式化输出,您可以使用seq

first=$(($1+($1%2)))
last=$2
seq -s, $first 2 $last

另存为脚本evens,并使用以下偶数调用$first

$ ./evens 2 25
2,4,6,8,10,12,14,16,18,20,22,24

或奇数值$first

$ ./evens 3 25
4,6,8,10,12,14,16,18,20,22,24
于 2013-03-23T23:49:04.630 回答