KornShell Script: liste tous les nombres pairs d’une plage

Ce que j’essaie de faire est d’énumérer tous les nombres qui sont pairs, entre les deux nombres que l’utilisateur entre via un script KornShell (ksh). Donc, si l’utilisateur entre pour le premier chiffre 2 alors le deuxième chiffre 25 serait affiché

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

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

Cela devrait fonctionner avec ksh93 et bash , ne nécessite pas seq ou perl qui pourraient ne pas être installés en fonction du système d’exploitation utilisé.

 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 

Dans ksh, en supposant que vous ayez utilisé des variables start et 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 

les sorties

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

il y a plusieurs façons de le faire en shell, shell script , awk , seq etc …

Depuis que vous avez marqué la question avec vi , j’en ai ajouté une avec vim :

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

source cette fonction, et tapez :call GetEven(2,25) vous verrez votre sortie attendue.

Il se répercute actuellement dans la zone de commande, si vous voulez qu’il soit affiché dans un fichier, utilisez simplement put ou setline , facile aussi.

En utilisant perl :

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

Il cède:

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

EDIT pour corriger la nouvelle ligne de fuite:

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

En définissant first=$(($1+($1%2))) et en utilisant l’option -s pour formater la sortie, vous pouvez utiliser seq :

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

Enregistrez en tant que script appelé evens et appelez avec des valeurs paires de $first :

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

Ou des valeurs impaires de $first :

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