【问题标题】:BASH problem to fill a file 'til a determined size填充文件直到确定大小的 BASH 问题
【发布时间】:2011-09-06 10:27:51
【问题描述】:

我编写了一个脚本来填充文件以进行一些磁盘容量测试。你能告诉我为什么我有错误吗?

#!/bin/bash 
COUNTER=0;
FILE_SIZE_BITS=8589934592;
FILE_NAME="fill_me";
while [ $COUNTER -eq 0 ]; do
    echo "Dummy text to fill the file" >> "$FILE_NAME";
    SIZE='stat -c%s fill_me';
    if [[ $SIZE -gt $FILE_SIZE_BITS ]]; then
        let COUNTER=COUNTER+1;
    fi
done

错误是:

-bash: [[: stat -c%s fill_me: division by 0 (error token is "fill_me")

谢谢

【问题讨论】:

    标签: bash shell rhel


    【解决方案1】:

    错误在这里:

    SIZE='stat -c%s fill_me'
    

    改为这样做:

    SIZE=$(stat -c%s fill_me)
    

    这会将 SIZE 设置为stat -c%s fill_me 命令的输出。 $(...) 语法是 Command Substitution 语法:

    命令替换允许命令的输出替换命令名称。


    顺便说一句,您可以使用 dd[manual] 做同样的事情:

    dd if=/dev/zero of=fill_me bs=1 count=8589934592
    

    【讨论】:

    • @ncohen:你真的是指“位”,而不是“字节”吗?除此之外,+1,尤其是指向dd 的指针,这是正确的做法。
    • 谢谢,就像一个魅力! @tripleee 据我所知, stat -c%s 给你一些比特......
    • 所以bs 中的计数是错误的,因为它是以字节为单位的。一旦知道就很容易解决。
    • @ncohen,来自the manual%s: Total size, in **bytes**
    • 为了提高效率,请在dd 命令行中使用更大的块大小。我最近没有测试过,但是几年前在 Linux 上,从速度的角度来看,最佳值是bs=65536。您需要相应地划分count= 值。
    【解决方案2】:

    正如 amaud576875 回答的那样,dd 是要走的路。

    为了好玩,这里有另一种方法:

    str63=123456789.123456789.123456789.123456789.123456789.123456789.123
    yes $str63 | head -134217728 > fill_me
    

    【讨论】:

      【解决方案3】:

      您已经发现了编程错误,但是从 shell 编程的角度来看,整个脚本相当笨拙。这是一个重构版本。

      #!/bin/bash 
      FILE_SIZE_BITS=8589934592;
      FILE_NAME="fill_me";
      while true; do
          echo "Dummy text to fill the file" >> "$FILE_NAME";
          SIZE=$(stat -c%s "$FILE_NAME")  # if you have a variable, use it everywhere
          if [[ $SIZE -gt $FILE_SIZE_BITS ]]; then
              break
          fi
      done
      

      变量名称COUNT 和您对其执行的算术相当具有误导性,因为一旦 COUNT 大于 0 就会退出。在这种情况下还不如使用真/假标志,但在这里,我不'甚至不将状态存储在变量中。相反,当退出条件为真时,我 break 退出循环(因此,整个脚本)。

      【讨论】:

        猜你喜欢
        • 2016-09-19
        • 2020-04-20
        • 1970-01-01
        • 2012-08-06
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 2021-07-19
        相关资源
        最近更新 更多