如何解决如何在bash中有条件地添加管道元素
我需要形成各种命令的管道。管道的某些元素或元素序列仅在某些条件成立时才相关。现在,我可以写:
if [[ $whatever ]]; then
cmd1 | cmd2 | cmd3 | cmd4
else
cmd1 | cmd4
fi
但这意味着重复cmd1
和cmd4
,另外,可能有几个条件,我不想写嵌套的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 举报,一经查实,本站将立刻删除。