【问题标题】:Using the read command to parse du -s output in linux shell script使用 read 命令解析 linux shell 脚本中的 du -s 输出
【发布时间】:2009-03-06 16:25:06
【问题描述】:

如果用户主目录超过一定大小,我正在尝试编写一个 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 是目录的大小。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    我想你会想要一些类似的东西

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

    【讨论】:

    • 这是一种繁重的方式——尽管与承担繁重工作的 'du' 相比,'cut' 的成本是最小的,所以也许反对意见是虚构的而不是真实的。
    • 同意 - 您的方法 2 看起来确实更优雅,并且不涉及使用额外的命令,如剪切、设置,甚至使用后退开关。
    • 谢谢...它也可能会丢失 'cd /home' 并使用 'du -s /home/* |'...TMTOWTDI 来引用(适度)众所周知的首字母缩略词。
    【解决方案2】:

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

    方法一:

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

    方法二:

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

    【讨论】:

      【解决方案3】:

      这是可以理解的,因为这就是你告诉它的。反引号的意思是:评估这个字符串,将它作为命令运行并给我输出。

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

      试试:

      echo $j | read k
      

      甚至删除前一行:

      du -s $i | read k
      

      (编辑 - 正确测试它,它在ksh 中工作正常,但在bash 中由于某种原因不能正常工作。我认为这可能与子shell 有关。使用反引号和@ 987654328@ 下面的解决方案,如果您使用的是 bash。)

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

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

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

      【讨论】:

      • 当我使用 k=echo $j |read first k 行时没有得到值。
      【解决方案4】:

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

      起点:Quota @ LQWiki

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 2014-01-14
        • 2014-05-12
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多