Shell管道中条件添加sort组件遇语法错误,如何解决?
如何在Shell管道中根据变量条件添加sort命令?
你原本想通过变量want_sorting的值,在Shell管道里选择性加入sort命令,但写的脚本出现了语法错误。
原脚本与报错情况
原脚本代码
want_sorting=0 generate_data() { for ((i=0; i<10; i++)); do echo "$RANDOM"; done; } consume_data() { while IFS= read -r line; do echo "got data: $line" done } generate_data | if [ "$want_sorting" = 1 ]; then sort | fi consume_data
报错信息
syntax error near unexpected token `fi'
可行解决方案
方案1:直接分支执行完整管道链
这是最直观的写法,根据变量值直接选择执行哪一条完整的管道命令:
want_sorting=0 generate_data() { for ((i=0; i<10; i++)); do echo "$RANDOM"; done; } consume_data() { while IFS= read -r line; do echo "got data: $line" done } if [ "$want_sorting" = 1 ]; then generate_data | sort | consume_data else generate_data | consume_data fi
方案2:封装可选排序的函数
把是否需要排序的逻辑封装成一个中间函数,管道里直接调用这个函数,它会根据变量自动决定是否执行sort:
want_sorting=0 generate_data() { for ((i=0; i<10; i++)); do echo "$RANDOM"; done; } maybe_sort() { # 需要排序就执行sort,不需要就直接透传输入到输出 [ "$want_sorting" = 1 ] && sort || cat } consume_data() { while IFS= read -r line; do echo "got data: $line" done } generate_data | maybe_sort | consume_data
方案3:用文件描述符动态处理输入
如果你的管道逻辑更复杂,这种方式更灵活,通过文件描述符先保存generate_data的输出,再根据条件决定是否经过sort后传给消费函数:
want_sorting=0 generate_data() { for ((i=0; i<10; i++)); do echo "$RANDOM"; done; } consume_data() { while IFS= read -r line; do echo "got data: $line" done } # 把generate_data的输出放到文件描述符3中 exec 3< <(generate_data) if [ "$want_sorting" = 1 ]; then sort <&3 | consume_data else consume_data <&3 fi # 用完后关闭文件描述符 exec 3<&-
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

