使用read命令解析linux shell脚本中的du -s输出

时间:2009-03-06 16:25:06

标签: bash shell

我正在尝试编写一个shell脚本,以便在用户主目录(如果超过一定大小)时执行操作。不幸的是,当我尝试使用read命令拆分du -s输出时,我得到'命令未找到',因为它试图将数字传递给shell,而不是像我想要的那样传递给变量。这是我到目前为止的脚本。

#!/bin/bash
cd /home
for i in `ls`
do
    j=`du -s $i`
    #this line gives me the error
    k=`$j |read first;`
done

我得到如下输出:

./takehome.sh: line 6: 3284972: command not found

其中3284972是目录的大小。

4 个答案:

答案 0 :(得分:7)

我想你会想要一些

的内容
#!/bin/bash
for i in *
do
    j=`du -s "$i" | cut -f 1`
    echo $i size is $j
done

读入另一个变量,读取和播放这似乎是多余的。

我认为更优雅的解决方案是Jonathan Leffler的第二种方法(复制粘贴在这里)

#!/bin/bash
cd /home
du -s * |
while read size name
do
    ...
done

答案 1 :(得分:7)

至少有两种方法可以做到这一点:

方法1:

#!/bin/bash
cd /home
for i in `ls`
do
    set -- `du -s $i`
    size=$1
    name=$2
    ...
done

方法2:

#!/bin/bash
cd /home
du -s * |
while read size name
do
    ...
done

答案 2 :(得分:2)

这是可以理解的,正如你告诉它的那样。反引号意味着:评估此字符串,将其作为命令运行并给我输出。

此外,read name表示将数据读入变量name

尝试:

echo $j | read k

甚至删除上一行:

du -s $i | read k

修改 - 正确测试,它在ksh中工作正常但在bash中却没有。出于某种原因。我认为它可能与子壳有关。使用如果您正在使用bash,请使用下面的反引号和cut解决方案。)

您可以保留反对并使用cut而不是read

k=`$du -s $i | cut -f1`

在这种情况下,它可能不会给你更多,但cutread更强大,可能在将来的某个时候帮助你。

答案 3 :(得分:0)

如果您只想限制用户可以使用的磁盘空间量,您可能需要查看磁盘配额的概念。

起点:Quota @ LQWiki