假设我将一些数据读入一个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..。我想知道在使用${w%%/*}时是否有一种方法可以使用shell参数展开printf,而不是循环所有元素并对每个元素执行它。
发布于 2016-06-08 09:15:08
哦,我刚刚找到了方法:只需正常使用参数展开,只针对${arr[@]}而不是${arr}!
$ IFS=" " read -a arr <<< "hello/how are/you iam/fine/yeah"
$ printf "%s\n" "${arr[@]%%/*}"
hello
are
iam格雷格的维基在这方面发挥了作用:
数组上的参数展开 BASH数组非常灵活,因为它们与其他shell扩展很好地集成在一起。可以在标量或单个数组元素上执行的任何参数扩展都可以同样地应用于整个数组或位置参数集,以便所有成员一次展开,可能通过在每个元素上映射额外的操作。 $ a=(alphaβγ)#通过复合赋值$ echo "${a@#a}“# chop 'a‘从每个成员的开头分配给我们的基数组
发布于 2021-01-21 14:17:02
基于@fedorqui的答案,如果OP想输出数组而不是字符串,这对我来说是有效的-
a=(alpha beta gamma)
newArr=( "${a[@]//a/f}" )我亲自来到这篇文章,希望在对数组的每个元素进行替换之后,输出一个数组。
https://stackoverflow.com/questions/37698108
复制相似问题