我有一个名为“arr”的数组,它具有以下值 -
post-ro
post-ro-1
post-ro-2
我有这个变量:
str="su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri"
我想str
通过替换pg
中存在的值来运行变量中定义的命令arr
。中的命令str
应运行 3 次(数组的长度),方法是迭代中的值并按顺序将命令中的值arr
替换为每个值。pg
所以最终的命令应该是:
su scp [email protected]:/etc/bp/post-ro/pri/user.json /etc/bp/post-ro/pri
su scp [email protected]:/etc/bp/post-ro-1/pri/user.json /etc/bp/post-ro-1/pri
su scp [email protected]:/etc/bp/post-ro-2/pri/user.json /etc/bp/post-ro-2/pri
答案1
使用 GNU xargs
,并假设$str
包含要传递给的参数的空格分隔列表su
,您可以这样做:
print0() {
[ "$#" -eq 0 ] || printf '%s\0' "$@"
}
IFS=' ' # split on space only
set -o noglob # disable globbing
xargs -r0a <(print0 "${arr[@]}") -I pg -- $str
(不加$str
引号会调用 split+glob,此处禁用 glob,并告知 split 仅在空间上拆分)。
如果$str
要包含命令的参数su
,那么使用数组会更有意义:
str=(
su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri
)
xargs -r0a <(print0 "${arr[@]}") -I pg -- "${str[@]}"
然后您无需大惊小怪$IFS
或noglob
将该字符串拆分为参数。