为什么下面不打印 3 2 1 6 5 4?
echo '1 2 3 4 5 6' | while read a b c; do echo result: $c b a; done
那岂不是先按顺序读前三个数字,反向打印,然后再读后三个数字,再反向打印?
答案1
您提供了一行包含 6 个“单词”的内容,但您将它们读入三个变量:a、b 和 c。第一个变量 a 被赋值为 1,第二个变量 b 被赋值为 2,c 保存该行的其余部分:“3 4 5 6”。
输出是3 4 5 6 b a
因为你没有写$c $b $a
,而只写了$c b a
。
如果你写了$c $b $a
,结果就会是3 4 5 6 2 1
。
答案2
令您困惑的关键点,其他答案略过,可以在bash 手册页:
read
…(选项)…[name ...]
从标准输入读取一行,…,第一个单词被分配给第一个姓名,第二个词到第二个词姓名,依此类推,剩余的单词及其中间分隔符分配给最后一个姓名… [重点补充。]
或在输出中help read
:
读…(选项)…[姓名...]
从标准输入读取一行并将其分成字段。
读单行从标准输入,……与单词拆分一样,该行被拆分为多个字段,第一个单词分配给第一个 NAME,第二个单词分配给第二个 NAME,依此类推,所有剩余单词分配给最后一个 NAME。 ……
要点:read
永远不要读超过一行。