这是我遇到的一个测试问题:
以下命令序列将产生什么输出?
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