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" ; donetr工具先把输入中的空格替换为换行符,让每个参数单独占一行,后续read每次就能读到单个参数,加-r参数可以避免参数中的反斜杠转义被自动处理。 - 方案3:如果参数来源不是管道,也可以用位置变量循环
命令写法:
用set -- aa bb cc for X in "$@"; do echo "$X" doneset --把参数存入位置变量列表,再遍历列表逐个打印。
内容的提问来源于stack exchange,提问作者Martin Vegter
相关产品推荐
相关产品推荐

