如果我有以下内容:
$ printf '%s\n' "${fa[@]}"
1 2 3
4 5 6
7 8 9
其中每一行都是一个新的数组元素。我希望能够通过空格分隔符拆分元素,并将结果用作3个单独的参数并输入xargs。
例如,第一个元素是:
1 2 3
使用xargs我希望将1
,2
和3
传递给一个简单的echo命令,例如:
$ echo $0
1
4
7
$ echo $1
2
5
8
$ echo $2
3
9
6
所以我一直在尝试以下列方式:
printf '%s\n' "${fa[@]}" | cut -d' ' -f1,2,3 | xargs -d' ' -n 3 bash -c 'echo $0'
给出:
1
2
3 4
5
6 7
8
9 10
除了奇怪的行排序 - 尝试xargs -d' ' -n 3 bash -c 'echo $0'
不会打印出第一个"元素"每一行,即
$ echo $0
1
4
7
而是将它们全部打印出来。
我要问的是,对于每个元素,如何将该行拆分为三个可以通过xargs引用的单独参数?
谢谢!
答案 0 :(得分:8)
你正朝着正确的方向前进
声明一个数组:
fa=('1 2 3' '4 5 6' '7 8 9')
实现您的目标:
printf '%s\n' "${fa[@]}" | xargs -n 3 sh -c 'echo call_my_command --arg1="$1" --arg2="$2" --arg3="$3"' argv0
这将回显您以下几行(相应地传递给xargs的更改命令)
call_my_command --arg1=1 --arg2=2 --arg3=3
call_my_command --arg1=4 --arg2=5 --arg3=6
call_my_command --arg1=7 --arg2=8 --arg3=9
如果我只是添加你的答案并稍微更改一下,我们就会得到以下内容
printf '%s\n' "${fa[@]}" | cut -d' ' -f1,2,3 | xargs -n 3 bash -c 'echo $0 $1 $2'
在xargs中注意缺少-d'',这个选项在某些版本的xargs中不可用。