微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在bash中有条件地添加管道元素

如何解决如何在bash中有条件地添加管道元素

我需要形成各种命令的管道。管道的某些元素或元素序列仅在某些条件成立时才相关。现在,我可以写:

if [[ $whatever ]]; then
   cmd1 | cmd2 | cmd3 | cmd4
else
   cmd1 | cmd4
fi

但这意味着重复cmd1cmd4,另外,可能有几个条件,我不想写嵌套的if。所以,我试着写这个:

if [[ $whatever ]]; then
    pipeline_segment="| cmd2 | cmd3"
else
    pipeline_segment=""
fi

cmd1 ${pipeline_segment} | cmd4

但是 - 管道符号没有被解释为使用管道的指令。

如何让 bash 执行我想要的管道?

注意:您可以假设 bash 版本为 4 或更高,但前提是您必须这样做。

解决方法

您的尝试失败了,因为特殊符号在扩展后失去了它们的语法值。 eval 是一种方式,但我们知道它很容易发生代码注入,因此最好避免。我们可以试试

cmd1 |
if [ condition ]; then
   cmd2 | cmd3
else
   cat
fi | 
cmd4

虽然我很想跳过 cat,但我找不到方法。真实例子:

echo XYZABC |
if true; then
   tr Y B | tr Z C
else
   cat
fi | 
tr X A

输出 ABCABC 并将条件更改为 false 输出 AYZABC

,

我认为您不想重复任何内容,因为它们是粗暴的命令。在这种情况下,使用函数来封装它们:

cmd1() { some big long command with many options and arguments; }
cmd2() { similar; }
... and so on

你可以直接使用这个

if [[ $whatever ]]; then
   cmd1 | cmd2 | cmd3 | cmd4
else
   cmd1 | cmd4
fi

或者,将 whatever 条件推送到函数中:

cmd2 () { 
    if [[ whatever ]]; then
        the big long command
    else
        cat
    fi
}
cmd3() {
    if [[ whatever ]]; then
        the other big long command
    else
        cat
    fi
}

然后,你就剩下了

cmd1 | cmd2 | cmd3 | cmd4

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。