Il n'est pas possible d'inverser la numérotation automatique des select
mais vous pouvez inverser les arguments, ce qui revient au même (logiquement).
Ce test en une ligne fonctionne correctement dans mon bash et les sélections effectuées correspondent à l'élément inversé correct :
$: function test { select f in $(echo $@|rev) ;do echo $f;done;};test a b c
1) c
2) b
3) a
#? 1
c
#? 2
b
#? 3
a
PS : Dans votre script vous n'avez pas besoin de la fonction. Vous appliquez simplement
select f in $(echo $@|rev) ;do
echo $f
done
Mise à jour
Comme indiqué dans les commentaires, l'utilisation de rev
pour inverser les arguments est valable pour les arguments à un seul caractère comme dans l'exemple de l'OP ( a b c
).
Si un argument est composé de plus de caractères (c.-à-d. cd
) alors rev
va également inverser cet arg (c'est-à-dire vers dc
).
Dans ce cas, il est plus sûr de stocker les arguments dans un tableau dans l'ordre inverse, et ensuite Select fera référence à ce tableau inversé comme ceci :
$: function test { local arr;for ((i=${#@};i>0;i--));do \
arr+=("${@:$i:1}");done;select f in "${arr[@]}";do echo "$f";done;};test a b cd
1) cd
2) b
3) a
#? 1
cd
En outre, il convient d'être prudent lors de l'utilisation de *
comme argument . Il doit être cité (c'est-à-dire '*'
) sinon bash l'étendra au contenu du répertoire de travail actuel. Cette limitation s'applique même dans le tout premier exemple de l'OP.