私がやろうとしているのは、ユーザーが KornShell (ksh) スクリプトを介して入力した 2 つの数字の間で、偶数であるすべての数字をリストすることです。したがって、ユーザーが最初の数字2
を入力すると、2 番目の数字25
が表示されます
2,4,6,8,10,12,14,16,18,20,22,24
これはとで動作するはずでksh93
ありbash
、必要ではないseq
かperl
、使用するOSによってはインストールされない可能性があります。
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
first=2 # from user
last=25 # from user
seq $first 2 $last
start
ksh では、変数とを使用したと仮定します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
shell script
シェル、、、などawk
でそれを行う方法はたくさんありますseq
...
質問にタグを付けたので、 vimvi
を追加しました:
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
で簡単です。
出力をフォーマットするオプションを設定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
使用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