Je voudrais appliquer extension des paramètres (par exemple, rechercher et remplacer) afin de supprimer des espaces de l 'extension d'accolade ({a..z} ). C'est possible?

J'ai donc la plage suivante: {a..z} qui se compose de toutes les lettres et je voudrais supprimer les espaces en une seule fois.

Voici un exemple plus long:

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ az=$(eval echo {a..z})
$ echo $az
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo ${az// /}
abcdefghijklmnopqrstuvwxyz

Est-il possible d'appliquer l'extension de paramètres directement sur une plage? Ou du moins pour le faire dans une expression, surtout sans l'affecter à une variable?


Un exemple d'utilisation consiste à spécifier tous les paramètres de manière dynamique pour getopts, par exemple:

while getopts {a..z} arg; do
  printf $arg
done

Cependant cela ne fonctionne pas (par exemple ./az.sh -a -b -c) car les espaces de cette plage doivent d'abord être supprimés.

1
kenorb 31 déc. 2015 à 00:16

2 réponses

Meilleure réponse

Utilisez plutôt ce code:

$ printf '%s' {a..z}; echo
abcdefghijklmnopqrstuvwxyz

Et ceci si vous devez utiliser un var (bash):

$ printf -v var '%s' {a..z}
$ echo "$var"
abcdefghijklmnopqrstuvwxyz

L'expansion des paramètres ne peut être appliquée qu'à un paramètre (d'où son nom).
Donc non, vous ne pouviez pas appliquer "Extension de paramètre" à une "Extension d'accolade". Il doit se faire en deux étapes:

var="$(printf '%s ' {a..z})"
var="${var// /}"

L'exemple getopts ressemblerait donc à:

while getopts "$(printf '%s' {a..z})" arg; do
  printf '%s' "$arg"
done
3
30 déc. 2015 à 22:00
$ set {m..z} && IFS=, && echo "$*"
m,n,o,p,q,r,s,t,u,v,w,x,y,z
$ set {m..z} && IFS='' && echo "$*"
mnopqrstuvwxyz
0
mauro 30 déc. 2015 à 21:40