KornShell脚本:列出范围内的所有偶数

时间:2013-03-23 22:15:52

标签: shell unix scripting ksh vi

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

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

6 个答案:

答案 0 :(得分:2)

first=2 # from user
last=25 # from user
seq $first 2 $last

答案 1 :(得分: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

答案 2 :(得分:2)

这应与ksh93bash一起使用,不需要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

答案 3 :(得分:1)

在shell中有很多方法,shell scriptawkseq等...

由于您使用 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)您将看到您的预期输出。

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

答案 4 :(得分: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

答案 5 :(得分: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