2016-08-05 7 views
1

Ich lerne Shell-Skript. Und ich möchte die Größe von Verzeichnissen (und Dateien) überprüfen. Ich machte ein Beispielskript alsWie erhalten Sie die Ergebnisse der Shell-Befehl Zeile für Zeile für sentese?

#!/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 

Die Struktur der Verzeichnisse unter dem aktuellen Verzeichnis hat nur ein Verzeichnis, "a".

Die Ergebnisse sind

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 = 

Es scheint Befehl "du" Ergebnisse Wort für Wort gibt. Aber ich erwartete Befehl „du“ Ergebnisse Zeile für Zeile gibt und ich die Ergebnisse des Skripts oben erwartet

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

Bitte erzählen, was mir falsch oder einen Vorschlag war.

Vielen Dank.

+0

In der Tat habe ich es nicht vollständig verstanden. Eine While-Schleife, wie John es vorgeschlagen hat, wäre die Antwort. –

Antwort

1

Um die Ausgabe eines Befehls, wie du, Zeile für Zeile zu lesen, versuchen:

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

Oder, wenn Sie eine Shell wie bash verwenden, das Verfahren Substitution unterstützt:

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

Es gibt einen großen Unterschied zwischen diesen beiden Ansätzen. Im ersten Beispiel wird die while-Schleife in einer Subshell ausgeführt, und somit verschwinden alle Variablen der Shell-Variablen, nachdem die Subshell beendet wurde. Im letzteren Code bleiben die Shell-Variablen verfügbar, nachdem die Schleife while abgeschlossen ist.

1

Sie benötigen eine while Schleife verwenden line-by-line iterieren der Ausgabe eines Befehls.

Auch dies wird in dem seltenen, aber legitimen Fall eines Verzeichnisnamens fehlschlagen, der eine neue Zeile enthält. Es gibt jedoch nicht viel, was Sie tun können, wenn Sie nicht eine Version von find verwenden, die anstelle von du eine Ausgabe mit Null-Begrenzung ausgeben kann.

Verwandte Themen