例如,我有一个任意字符串数组a=(1st "2nd string" $'3rd\nstring\n' ...)
.
例如,我想将这些字符串传递给将其参数解释为文件的命令paste
.
对于固定数量的变量,我们可以使用过程替换
paste <(printf %s "$var1") <(printf %s "$var2") <(printf %s "$var3")
但这只有在事先知道变量数量的情况下才有效。
对于数组a
,我们可以写一些相当安全的东西,比如
eval paste $(printf '<(printf %%s %q) ' "${a[@]}")
出于兴趣:有没有一种方法可以处理替换每个a
的条目不使用eval
?请记住a
的条目可以包含任何字符(除了\0
因为bash
不支持)。
这是一个示例,说明如何使用递归一次设置一个参数的参数列表。该技术有时是有用的。
使用流程替换将文本转换为管道可能不是当前问题的最佳解决方案,但它确实具有重用现有工具的优点。
我试图使代码相当通用,但可能需要进行更多调整。
nameref 需要 Bash 4.3(尽管如果您还没有达到该版本,您可以使用固定的数组名称来实现)。 Namerefs 需要小心,因为它们不卫生;可以通过名称捕获局部变量。因此使用以下划线开头的变量名。
# A wrapper which sets up for the recursive call
from_array() {
local -n _array=$1
local -a _cmd=("${@:2}")
local -i _count=${#_array[@]}
from_array_helper
}
# A recursive function to create the process substitutions.
# Each invocation adds one process substitution to the argument
# list, working from the end.
from_array_helper() {
if (($_count)); then
((--_count))
from_array_helper <(printf %s "${_array[_count]}") "$@"
else
"${_cmd[@]}" "$@"
fi
}
Example
$ a=($'first\nsecond\n' $'x\ny\n' $'27\n35\n')
$ from_array a paste -d :
first:x:27
second:y:35
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)