【问题标题】:Shell parameter expansion on arrays数组上的 Shell 参数扩展
【发布时间】:2021-01-21 22:17:02
【问题描述】:

假设我将一些数据读入 Bash 数组:

$ IFS=" " read -a arr <<< "hello/how are/you iam/fine/yeah"

现在,我想为数组中的每个元素打印第一个 /-sliced 字段。

我所做的是循环遍历元素并使用 shell 参数扩展从第一个 / 中剥离所有内容:

$ for w in "${arr[@]}"; do echo "${w%%/*}"; done
hello
are
iam

但是,由于printf 允许我们在单个表达式中打印数组的全部内容:

$ printf "%s\n" "${arr[@]}"
hello/how
are/you
iam/fine

...我想知道是否有一种方法可以在使用printf 时使用shell 参数扩展${w%%/*},而不是循环遍历所有元素并针对每个元素执行此操作。

【问题讨论】:

    标签: arrays bash parameter-expansion


    【解决方案1】:

    哦,我刚刚找到了方法:正常使用参数扩展,只是针对${arr[@]}而不是${arr}

    $ IFS=" " read -a arr <<< "hello/how are/you iam/fine/yeah"
    $ printf "%s\n" "${arr[@]%%/*}"
    hello
    are
    iam
    

    Greg 的 wiki 在这里提供了帮助:

    Parameter Expansion on Arrays

    BASH 数组非常灵活,因为它们集成得很好 与其他外壳扩展。任何可以扩展的参数 对标量或单个数组元素执行同样适用 到整个数组或一组位置参数,使得所有 成员会立即展开,可能需要额外的操作 映射到每个元素。

    $ a=(alpha beta gamma)  # assign to our base array via compound assignment
    $ echo "${a[@]#a}"      # chop 'a' from the beginning of every member
    lpha beta gamma
    $ echo "${a[@]%a}"      # from the end
    alph bet gamm
    $ echo "${a[@]//a/f}"   # substitution
    flphf betf gfmmf
    

    【讨论】:

    • 这真的很酷,不敢相信我自己没有尝试过。
    • @andlrc 我也很惊讶!它非常简单且功能强大。
    【解决方案2】:

    基于@fedorqui 的回答,如果 OP 想要输出一个数组而不是字符串,这对我有用-

    a=(alpha beta gamma)
    newArr=( "${a[@]//a/f}" )
    

    附:我亲自来到这篇文章,希望在对数组的每个元素进行替换后输出一个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多