我有以下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'
xargs
如果您直接从命令中进行管道操作,则可以正常工作,但如果您将相同命令输出的结果echo
则不行。
在你的命令中添加这个转换:
#!/bin/bash
echo $serial_numbers | tr ' ' 'n' | xargs -P $(echo $serial_numbers | wc -w) -I % ddcutil setvcp 10 100 --sn %
xargs
现在将理解您想要拆分您的序列号。
或者,您可以将tr
放在第一行,并将分隔的序列号存储在变量中。
xargs
有-n
选项,这在某种程度上可用于分割单字符串输入。但我注意到,将-I
与-n1
一起使用会破坏其分裂行为(未引号的空白不会终止输入项-man xargs
)。因此,除了使用tr
之外,另一种换行方法是显式地将分隔符通过-d
传递给xargs
。此外,您还需要将-n
添加到echo
中以删除尾随换行符,即您所看到的$'n'
(它将破坏后续管道):
echo -n "a b c" | xargs -d " " -I% echo letter_%
或者您可以在管道中插入另一个xargs:
echo -n "a b c" | xargs -n1 | xargs -I% echo letter_%