【问题标题】:How to apply parameter expansion on brace expansion (range)?如何在大括号扩展(范围)上应用参数扩展?
【发布时间】:2015-12-30 21:16:29
【问题描述】:

我想申请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),因为需要先删除该范围内的空格。

【问题讨论】:

    标签: bash syntax brace-expansion parameter-expansion


    【解决方案1】:

    改用此代码:

    $ 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
    

    【讨论】:

      【解决方案2】:
      $ 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
      

      【讨论】:

      • 会话全局修改IFS以获得局部效果。
      • 同样覆盖当前位置参数而不保存它们。
      • (declare -a f=({a..z});IFS=;echo "${f[*]}")。但是 printf 解决方案更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多