5

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

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

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

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

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

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

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

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

4

2 回答 2

5

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

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

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

数组的参数扩展

BASH 数组非常灵活,因为它们与其他 shell 扩展很好地集成在一起。可以在标量或单个数组元素上执行的任何参数扩展都可以同样适用于整个数组或位置参数集,以便一次扩展所有成员,可能在每个元素上映射一个附加操作。

$ 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
于 2016-06-08T09:15:08.347 回答
0

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

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

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

于 2021-01-21T14:17:02.193 回答