我要做的是列出用户通过 KornShell (ksh) 脚本输入的两个数字之间的所有偶数。因此,如果用户输入第一个数字,那么它将显示2
第二个数字25
2,4,6,8,10,12,14,16,18,20,22,24
这应该与ksh93
and一起使用bash
,不需要seq
或perl
可能不会安装,具体取决于所使用的操作系统。
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
在 ksh 中,假设您使用了变量start
和end
:
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
first=2 # from user
last=25 # from user
seq $first 2 $last
在 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)
您将看到预期的输出。
它目前在命令区域回显,如果您希望它显示在文件中,只需使用put
or setline
,也很容易。
使用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
通过设置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