我有一个脚本s1
,它输出用“,”分隔的数字列表,例如1,2,3,4
。现在我想将这些数字s2
作为参数提供给脚本,以便 s2 将在它们中的每一个上运行并将其结果输出到单独的行中。例如,如果 s2 将数字乘以 2,这将是我正在寻找的结果:
2
4
6
8
我现在正在做的是:
s1 | xargs -d "," | xargs -n1 s2
但是我觉得我这样做很愚蠢!所以我的问题是:
正确的做法是什么?
我的解决方案的问题是它调用 xargs 两次并迭代输入两次,这在我看来当然是不合理的性能!答案xargs -d "," -n1
似乎不错,但我不确定它是否只迭代一次。如果是,请在您的答案中验证,我会接受。顺便说一句,我宁愿不使用 Perl,因为它仍在迭代两次,而且 Perl 可能不存在于许多系统上。
这也应该同样有效:
测试用例:
结果:
如果
s1
输出该列表后跟换行符,则您需要将其删除,否则最后一次调用将是 with4\n
而不是4
:如果
s2
可以接受多个参数,您可以这样做:它暂时将 IFS 覆盖为逗号,全部位于子shell中,以便看到由逗号分解
s2
的输出。s1
子shell 是更改 IFS 的快捷方式,无需保存先前的值或重置它。此答案的先前版本不正确,可能是由于剩余的 IFS 设置损坏了结果。感谢ilkkachu指出我的错误。
要手动循环输出并将它们单独提供给
s2
,这里演示了 IFS 的保存和重置:或像以前一样在子shell中运行 IFS 位:
尝试这个: