如何在大括号扩展(范围)上应用参数扩展?
How to apply parameter expansion on brace expansion (range)?
我想申请 parameter expansion (e.g. search and replace) in order to remove spaces from the 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
),因为需要先删除该范围内的空格。
改用此代码:
$ printf '%s' {a..z}; echo
abcdefghijklmnopqrstuvwxyz
如果你需要使用 var (bash):
$ printf -v var '%s' {a..z}
$ echo "$var"
abcdefghijklmnopqrstuvwxyz
参数扩展只能应用于参数(因此得名)。
所以不,你不能将 "Parameter expansion" 应用于 "Brace Expansion".
必须分两步:
var="$(printf '%s ' {a..z})"
var="${var// /}"
因此 getopts
示例如下所示:
while getopts "$(printf '%s' {a..z})" arg; do
printf '%s' "$arg"
done
$ 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
我想申请 parameter expansion (e.g. search and replace) in order to remove spaces from the 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
),因为需要先删除该范围内的空格。
改用此代码:
$ printf '%s' {a..z}; echo
abcdefghijklmnopqrstuvwxyz
如果你需要使用 var (bash):
$ printf -v var '%s' {a..z}
$ echo "$var"
abcdefghijklmnopqrstuvwxyz
参数扩展只能应用于参数(因此得名)。
所以不,你不能将 "Parameter expansion" 应用于 "Brace Expansion".
必须分两步:
var="$(printf '%s ' {a..z})"
var="${var// /}"
因此 getopts
示例如下所示:
while getopts "$(printf '%s' {a..z})" arg; do
printf '%s' "$arg"
done
$ 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