我有一个我想要启用的过滤器,我想知道如何以干净的方式在bash中执行此操作。
FILTER="| sort" # also can be empty
ls $FILTER | cat
此代码不起作用,因为它会以ls
和|
作为参数调用sort
。
我该如何正确地做到这一点?请注意,我试图避免创建if
块以保持代码易于维护(我的管道链比这个例子复杂得多)
答案 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"
如果选择此方法,则必须确保命令在语法上有效并且完全符合您的意图,而不是做出灾难性的事情。