2016-08-05 52 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