2016-08-05 51 views
1

我正在學習shell腳本。我想檢查目錄(和文件)的大小。我做了一個示例腳本爲如何獲得shell命令行的結果?

#!/bin/bash 

for dir in $(du ".") 
do 
    echo "dir = $dir" 
    read T_SIZE T_PATH <<< $dir 
    echo "T_SIZE = $T_SIZE" 
    echo "T_PATH = $T_PATH" 
done 

當前目錄下的目錄結構只有一個目錄「a」。

的結果是

dir = 4 
T_SIZE = 4 
T_PATH = 
dir = ./a 
T_SIZE = ./a 
T_PATH = 
dir = 16 
T_SIZE = 16 
T_PATH = 
dir = . 
T_SIZE = . 
T_PATH = 

看來命令「杜」字由結果給出了字。 不過,我預計命令「嘟」按行給出的結果行,我期待的腳本的結果以上是

dir = 4 
T_SIZE = 4 
T_PATH = ./a 
dir = 16 
T_SIZE = 16 
T_PATH = . 

請告訴我,什麼是錯或建議給我。

非常感謝。

+0

確實我沒有完全理解它。約翰建議的while循環就是答案。 –

回答

1

要讀取命令的輸出,如du,一行行,試試:

du . | while read size path 
do 
    echo "size=$size path=$path" 
done 

或者,如果您使用的是外殼,如bash,支持進程替換:

while read size path 
do 
    echo "size=$size path=$path" 
done < <(du ".") 

這兩種方法有很大的區別。在上面的第一個中,while循環運行在一個子shell中,因此,其所有shell變量變量在子shell完成後都會消失。在後面的代碼中,shell變量在while循環完成後保持可用。

1

您需要使用一個while循環來逐行遍歷命令的輸出。

while read size dir; do 
    echo "$dir is $size bytes" 
done < <(du .) 

即使是這樣,在罕見但合法的情況下,包含新行的目錄名稱也會失敗。儘管如此,您可以做的並不多,但使用find的版本可以輸出空分隔的輸出來代替du