2012-09-27 51 views
67

更新迴音,我有以下的擊(在Linux中)如何能夠展示在同一行

for dir in Movies/* 
do 
    (cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist && 
    exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist) 
echo "Movie $movies - $dir ADDED!" 
let movies=movies+1 
done 

但我想使它這樣的「回聲」表示下一行下面的回聲(不與最後的echo輸出連接,但將其替換),以使其看起來像正在更新。類似於具有百分比的進度條如何顯示在同一行上。

回答

115

那麼我沒有正確閱讀man echo這一頁。

回聲有2個選項可以做到這一點,如果我添加了第三個轉義字符。

2個選項是-n-e

-n不會輸出結尾的換行符。因此,每當我回應某些內容時,我都不用再換一個新的線。

-e將允許我解釋反斜槓轉義符號。

猜猜我想用什麼逃脫符號:\r。是的,回車可以讓我回到起點,它會看起來像我在同一條線上更新。

所以回聲線是這樣的:

echo -ne "Movie $movies - $dir ADDED!"\\r

我不得不逃離逃逸符號這樣的Bash不會殺死它。這就是爲什麼你會在那裏看到2 \符號。

正如威廉所說,printf也可以做類似的(甚至更廣泛的)這樣的任務。

+8

只是對未來的一個提示:printf會做同樣的事情,沒有任何選項。優點是printf在每個環境和操作系統中的行爲通常都是相似的,而echo有時表現得非常不同。對於跨平臺腳本(或者如果你認爲你可能會關心這一點),使用printf是最佳實踐。 –

+0

真棒@WilliamTFroggard謝謝你的朋友。 –

+3

'printf a; printf b'輸出'ab' ---'printf a \\ r; printf b'輸出'b' ---'printf a \\ r;睡1; printf b''輸出'a',然後'b' – XavierStuvw

50

如果我已經瞭解好了,你可以把它與下面的行替換您的迴音:

echo -ne "Movie $movies - $dir ADDED! \033[0K\r" 

這裏,您可以運行,瞭解其行爲的一個小例子:

#!/bin/bash 
for pc in $(seq 1 100); do 
    echo -ne "$pc%\033[0K\r" 
    sleep 1 
done 
echo 
+0

在zsh上看起來'K'並不是必要的,事實上它會以字母K的形式出現。 – mknaf

+1

很好的例子 - 對我來說,開始時的hash bang是關鍵 –

9

其餘的答案都非常好,但只是想添加一些額外的信息,以防有人來這裏尋找替代/更新多線回聲的解決方案。

所以我想和大家分享一個例子。在CentOS系統上嘗試了以下腳本,並使用「timedatectl」命令,該命令基本上打印了系統的一些詳細時間信息。

我決定使用這個命令,因爲它的輸出包含多行和完全適用於下面的例子:

#!/bin/bash 
while true; do 
    COMMAND=$(timedatectl) #Save command result in a var. 
    echo "$COMMAND" #Print command result, including new lines. 

    sleep 3 #Keep above's output on screen during 3 seconds before clearing it 

    #Following code clears previously printed lines 
    LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed 
    for ((i=1; i <= $(($LINES)); i++));do #For each line printed as a result of "timedatectl" 
    tput cuu1 #Move cursor up by one line 
    tput el #Clear the line 
    done 

done 

以上將打印的結果「timedatectl」永遠將取代之前的回聲更新結果。

我不得不提的是,這段代碼只是一個例子,但根據您的需要,可能不是最好的解決方案。 類似的命令幾乎相同(至少在視覺上)是「watch -n 3 timedatectl」。

但這是一個不同的故事。 :)

希望幫助!

+1

經過測試。通過。謝謝 – XavierStuvw

1

我最喜歡的方式叫睡覺到50.這裏i變量需要在echo語句裏面使用。

for i in $(seq 1 50); do 
    echo -ne "$i%\033[0K\r" 
    sleep 50 
done 
echo "ended" 
0

這是有用的,請嘗試它並根據需要進行更改。

#! bin/bash 
for load in $(seq 1 100); do 
    echo -ne "$load % downloded ...\r" 
    sleep 1 
done 
echo "100" 
echo "Loaded ..."