我有以下shell脚本:
serial_numbers=$(ddcutil detect | grep "Serial number" | awk '{print $3}' | uniq)
echo $serial_numbers | xargs -P $(echo $serial_numbers | wc -w) -I % ddcutil setvcp 10 100 --sn %
变量$serial_number
包含字符串'8TRNJQ2 FGVF2Y2'
。xargs
将这个字符串解释为一个参数,并且只产生一个ddcutil setvcp
的调用。但是我希望xargs
在空格处拆分字符串,所以i ~得到两个以8TRNJQ2
和FGVF2Y2
为参数的调用。
编辑:使用-t ' '
会给字符串的最后一部分带来奇怪的结果:'FGVF2Y2'$'\n'
2条答案
按热度按时间vtwuwzda1#
如果您直接从命令中通过管道传输
xargs
,则它可以正常工作,但如果您使用echo
传输同一命令输出的结果,则无法正常工作。在命令中添加以下转换:
xargs
现在将理解您希望拆分序列号。或者,您可以将
tr
放在第一行,并将分隔的序列号存储在变量中。yc0p9oo02#
xargs
有一个-n
选项,可以用来拆分单字符串输入,但是我注意到:将-I
与-n1
一起使用会破坏其分裂行为(* 未加引号的空格不会终止输入项 * -man xargs
)。因此,除了使用tr
之外,另一种换行方式是使用-d
显式地将分隔符传递给xargs
。另外,你需要在echo
中添加-n
,以删除尾随的换行符,即你看到的$'\n'
(它会打断后续的管道):也可以在管道中插入另一个xargs: