在bash中为每个对象执行
我希望编写一个Bash-one行程序,为列表中的每个项调用一次函数。例如,给定列表 foo bar baz 但我无法想象没有其他方法可以做到这一点 编辑:我想我最初的问题不是很清楚。我希望能够在不编写bash脚本的情况下执行类似的操作:在bash中为每个对象执行,bash,Bash,我希望编写一个Bash-one行程序,为列表中的每个项调用一次函数。例如,给定列表 foo bar baz 但我无法想象没有其他方法可以做到这一点 编辑:我想我最初的问题不是很清楚。我希望能够在不编写bash脚本的情况下执行类似的操作: #!/bin/sh for w in $@; do cowsay $w done locate foo | sed s/bar/baz/ | [other-processing] | [insert-magic-here] cowsay 关键是我试图避
#!/bin/sh
for w in $@; do
cowsay $w
done
locate foo | sed s/bar/baz/ | [other-processing] | [insert-magic-here] cowsay
关键是我试图避免编写脚本,这样我就可以将它添加到我的管道链中,而不用考虑它。在一行中:
for i in foo bar baz; do cowsay $i; done
或者更清楚地说:
foobar="foo bar baz"
for i in $foobar
do
cowsay $i
done
您可以编写一个函数,将其转换为一个线性函数:
function foreach
{
func=$1; shift
for arg in $@; do
${func} ${arg}
done
}
然后像这样调用它:
foreach cosway foo bar baz
如果您对使用“for”循环不感兴趣,那么迭代字符串列表的其他选项是使用“while”或“until”循环 您是否希望编写一个bash脚本,可以按如下方式执行
$cowsay loop foo bar嗡嗡声
听起来你想使用xargs
$ echo foo bar | xargs -n 1 cowsay
_____
< foo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_____
< bar >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$echo foo bar | xargs-n 1 cowsay
_____
-----
\ ^__^
\(oo)\_______
(__)\ )\/\
||----w|
|| ||
_____
-----
\ ^__^
\(oo)\_______
(__)\ )\/\
||----w|
|| ||
您需要xargs
。如果没有for
,while
或until
循环结构,xargs
几乎是唯一能满足您要求的东西
如果需要xargs为每个输入执行命令,请使用-n1
,而不是将多个输入作为单独的参数执行。你的例子变成:
$ locate foo | sed s/bar/baz/ | [other-processing] | xargs -n1 cowsay
正如其他人所说,xargs(1)是您想要的,但它并不总是合适的。最常见的情况是,当我想运行shell函数时,它失败了。xargs运行一个可执行命令 您可以在管道中放入循环,而无需将其放入shell脚本:
$ locate foo | sed s/bar/baz/ | [other-processing] | while read line ; do cowsay "$line" ; done
如果cowsay是一个shell函数,那么这个管道可以工作,但不能用于xargs。是的。但是有没有一种不用for循环就能做到这一点的方法呢?我想这才是真正的问题。这很接近,但仍然需要编写脚本。有没有一种内在的方法可以做到这一点?对不起,我(又)不清楚。我想避免的不是for循环,而是脚本本身。我编辑了我的问题,希望能有更多的意义。啊哈!我知道xargs,但不知道-n标志。太棒了,谢谢。很有趣。我不认为自己需要经常在shell函数中使用它,但知道这一点很好。希望它能防止一些头发拉扯和谷歌搜索。
$ locate foo | sed s/bar/baz/ | [other-processing] | while read line ; do cowsay "$line" ; done