Bash:如何建立一个递归的cowsay

时间:2017-04-07 07:50:39

标签: linux bash

这是一个linux命令(您可能需要cowsay应用程序。

cowsay 'moo'

这是另一个命令:

cowsay 'moo' | cowsay -n

结果非常有趣:

 ______________________________
/  _____                       \
| < moo >                      |
|  -----                       |
|         \   ^__^             |
|          \  (oo)\_______     |
|             (__)\       )\/\ |
|                 ||----w |    |
\                 ||     ||    /
 ------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

现在,当然,重复该管道命令N次非常有趣。它看起来有点像这样:

 cowsay 'moo' | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n | cowsay -n

Cows nested inside cows saying things

但我认为必须采用更简洁的方法来实现这一目标。我只想说我要500头奶牛都说对方,或1000或1,000,000。当然,我不仅要将手指放在粘贴按钮上吗?

这是问题所在;在bash(命令或脚本)中有一种方法可以递归地将命令的输出传递给自己一定次数吗?

2 个答案:

答案 0 :(得分:4)

cowsayN() {
    local n=$1
    shift
    if ((n>1)); then
        cowsay -n | cowsayN $((n-1))
    else
        cowsay -n
    fi
}
echo 'moo' | cowsayN 500

答案 1 :(得分:2)

我暂时无法测试它:

output=$(cowsay 'moo')
for ((i=0;i<50;i+=1)); do output=$(cowsay "$output"); done
echo "$output"

修改后添加&lt;&lt;&lt;传递值作为输入

output=$(cowsay <<<'moo')
for ((i=0;i<50;i+=1)); do output=$(cowsay <<<"$output"); done
echo "$output"