如何在bash中使用条件管道过滤器?

时间:2017-08-15 09:30:35

标签: bash pipe

我有一个我想要启用的过滤器,我想知道如何以干净的方式在bash中执行此操作。

FILTER="| sort" # also can be empty
ls $FILTER | cat

此代码不起作用,因为它会以ls|作为参数调用sort

我该如何正确地做到这一点?请注意,我试图避免创建if块以保持代码易于维护(我的管道链比这个例子复杂得多)

2 个答案:

答案 0 :(得分:3)

您所考虑的内容并不起作用,因为在解析语法之后发生了变量扩展。

您可以这样做:

foo_cmd | if [ "$order" = "desc" ] ; then
    sort -r
else
    sort
fi | if [ "$cut" = "on" ] ; then
    cut -f1
else
    cat
fi

答案 1 :(得分:0)

您可以创建命令并在不同的shell中执行它。

FILTER="| sort" # create your filter here
# ls $FILTER | cat  <-- this won't work
bash -c "ls $FILTER | cat"

# or create the entire command and execute (which, i think, is more clean)
cmd="ls $FILTER | cat"
bash -c "$cmd"

如果选择此方法,则必须确保命令在语法上有效并且完全符合您的意图,而不是做出灾难性的事情。