Shell

序列命令和測試題

  • April 22, 2018

這是我遇到的一個測試問題:

以下命令序列將產生哪個輸出?

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。)

從閱讀手冊頁:

從標準輸入讀取單行,如果提供了 -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

引用自:https://unix.stackexchange.com/questions/439155