序列命令和测试问题

序列命令和测试问题

这是我遇到的一个测试问题:

以下命令序列将产生什么输出?

echo '1 2 3 4 5 6' | while read a b c; do

echo result: $c $b $a;
done

正确答案是:3 4 5 6 2 1

我不知道为什么。有人可以向我解释一下吗?

(一开始我以为答案是3 2 1。)

答案1

从阅读的联机帮助页中:

从标准输入读取一行,如果提供了 -u 选项,则从文件描述符 FD 读取一行。与单词拆分一样,该行被拆分为多个字段,第一个单词分配给第一个 NAME,第二个单词分配给第二个 NAME,依此类推,所有剩余单词分配给最后一个 NAME。只有在 $IFS 中找到的字符才会被识别为单词分隔符。

出于这个原因,我通常使用“垃圾”变量来收集可能剩下的任何东西:

echo '1 2 3 4 5 6' | while read a b c TRASH; do 
    echo "result is: $c $b $a"
    echo "trash is: $TRASH"
done

正在使用:

$ echo '1 2 3 4 5 6' | while read a b c TRASH; do
>     echo "result is: $c $b $a"
>     echo "trash is: $TRASH"
> done
result is: 3 2 1
trash is: 4 5 6

相关内容