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

dash作为/bin/sh时如何从管道中逐个读取独立参数并分行输出

问题说明

我当前使用dash shell作为/bin/sh。
执行如下命令时的输出为:

echo aa bb cc | while read X ; do echo $X ; done
aa bb cc

我需要实现参数的独立读取,即让最终输出为如下形式,该如何调整命令?

aa
bb
cc
解决方案

dash中read命令仅指定1个变量时,默认会把整行除末尾换行外的所有内容完整赋值给该变量,因此原来的写法会一次性读取所有参数输出整行。你可以用以下几种兼容dash的方案实现需求:

  • 方案1:使用xargs -n 1拆分参数,是最简单的实现方式
    命令写法:
    echo aa bb cc | xargs -n 1
    
    其中-n 1参数指定xargs每次只传递1个参数给后续命令,默认后续命令是echo,直接输出单个参数。
  • 方案2:先将空格替换为换行符,再用原来的while循环读取
    命令写法:
    echo aa bb cc | tr ' ' '\n' | while read -r X ; do echo "$X" ; done
    
    用tr工具先把输入中的空格替换为换行符,让每个参数单独占一行,后续read每次就能读到单个参数,加-r参数可以避免参数中的反斜杠转义被自动处理。
  • 方案3:如果参数来源不是管道,也可以用位置变量循环
    命令写法:
    set -- aa bb cc
    for X in "$@"; do
        echo "$X"
    done
    
    用set --把参数存入位置变量列表,再遍历列表逐个打印。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 19:27:01