我想应用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
),因为需要首先删除该范围内的空格。
答案 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