1

我想应用参数扩展(例如搜索和替换)以从大括号扩展{a..z})中删除空格。有可能的?

所以我有以下范围:{a..z}它包含所有字母,我想一次性删除空格。

这是更长的示例:

$ 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

是否可以直接在范围上应用参数扩展?或者至少在一个表达式中实现它,尤其是在没有将其分配给变量的情况下?


一个示例用法是为 动态指定所有参数getopts,例如:

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

但是这不起作用(例如./az.sh -a -b -c),因为需要先删除该范围内的空格。

4

2 回答 2

3

请改用此代码:

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

如果您需要使用 var (bash),请执行以下操作:

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

参数扩展只能应用于参数(因此得名)。
所以不,您不能将“参数扩展”应用于“大括号扩展”。
必须分两步:

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

所以getopts例子看起来像:

while getopts "$(printf '%s' {a..z})" arg; do
  printf '%s' "$arg"
done
于 2015-12-30T21:30:16.727 回答
0
$ 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
于 2015-12-30T21:40:33.940 回答