我要做的是列出用户通过KornShell(ksh)脚本输入的两个数字之间的所有偶数。因此,如果用户输入第一个数字2
,则第二个数字25
将显示
2,4,6,8,10,12,14,16,18,20,22,24
答案 0 :(得分:2)
first=2 # from user
last=25 # from user
seq $first 2 $last
答案 1 :(得分:2)
在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
答案 2 :(得分:2)
这应与ksh93
和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
答案 3 :(得分: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)
您将看到您的预期输出。
它目前在命令区域中回显,如果您希望它显示在文件中,只需使用put
或setline
,也很容易。
答案 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