You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash中通过重定向调用awk时多行输入参数同行显示的问题

问题原因

问题出在输入传递的方式上:<<< "$@"会把所有传入的参数拼接成单个空格分隔的字符串作为awk的输入,所以awk只处理一行数据,自然不会按参数分行打印。

修复方案

把输入传递方式从<<< "$@"改成用printf "%s\n" "$@"通过管道传递给awk,这样每个参数会被单独作为一行输入给awk,符合预期的分行打印需求。

修改后的代码:

firefly () {
 sgr="$( tput sgr0 )"
 blu="$( tput bold; tput setaf 39 )"

 lseq="1,2"

 printf "%s\n" "$@" | awk -v frg="$blu" -v rst="$sgr" -v lnum="$lseq"  \
  'BEGIN { split(lnum, laggr, ",") }
   {
    found = 0
    for (item in laggr) {
       if (laggr[item] == NR) { found = 1 ; break }
     }

    if (found) { fm="%s%s%s\n" ; printf(fm, frg, $0, rst) }
    else { fm = "%s\n" ; printf(fm, $0) }
  }'
 }
验证测试

执行firefly "First Line" "Second Line" "Third Line",输出会按参数分行显示,且第1、2行应用蓝色加粗样式:

First Line
Second Line
Third Line
补充说明
  • printf "%s\n" "$@"会遍历所有位置参数,为每个参数添加换行符,确保每个参数单独成一行。
  • 管道|将printf的输出作为awk的标准输入,awk逐行处理时,NR(当前行号)能正确对应每个参数的位置,着色逻辑也能正常生效。

内容的提问来源于stack exchange,提问作者Dilna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:12:39