Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中为每个对象执行_Bash - Fatal编程技术网

在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 关键是我试图避

我希望编写一个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
关键是我试图避免编写脚本,这样我就可以将它添加到我的管道链中,而不用考虑它。

在一行中:

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