如何在支撑扩展(范围)上应用参数扩展?

时间:2015-12-30 21:16:30

标签: bash syntax brace-expansion parameter-expansion

我想应用parameter expansion(例如搜索和替换),以便从brace expansion{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),因为需要首先删除该范围内的空格。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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