如何在bash中有条件地添加管道元素
我需要形成各种命令的管道。管道的某些元素或元素序列仅在某些条件成立时才相关。现在,我可以写:
if [[ $whatever ]]; then
cmd1 | cmd2 | cmd3 | cmd4
else
cmd1 | cmd4
fi
但这意味着重复cmd1
and 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
。