有時咱們須要更新同一行輸出信息,而不是輸出新行,如進度顯示。兩種實現方法:bash
\b
,清除該行輸入字符\r
,而後覆蓋已輸出的字符對於第1種實現,該行已輸出多少字符,須要恰好輸出相同數量的\b
,以防止某些終端實現把上一行的回車也吃掉了。可以使用printf()
的返回值獲得已輸出字符數。命令行
對於第2種實現,輸出的新字符數量必須很多於已輸出的,以徹底覆蓋以前的輸出。3d
本人更傾向於第2種實現,只要保證每行輸出的字符數量相同(經過printf()
指定參數的輸出字符數),實現更簡潔、維護性更好。code
本文分別給出C語言和Shell的實現例子。io
c#include <stdio.h> #include <unistd.h> int main(void) { int i; for (i = 0; i < 100; i++) { printf("\rprogress: %3d %%", i); fflush(stdout); sleep(1); } printf("\n"); return 0; }
須要特別注意的是,終端設備是行緩衝
設備,即除非輸出換行符\n
或緩衝區已滿,不然printf()
不會有任何輸出;因此這裏須要使用fflush(stdout)
清除標準輸出緩衝區,以當即輸出緩衝區內容。終端
bash#!/bin/bash for i in {1..100} do printf "\rprocess %3d %%" $i sleep 1 done # print a new line echo
腳本中可以使用printf
命令行程序。程序