0

ディスク容量のテスト用にファイルを埋めるスクリプトを作成しました。エラーが発生する理由を教えてください。

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

ありがとう

4

3 に答える 3

6

エラーは次のとおりです。

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
于 2011-09-06T10:30:51.223 に答える
2

amaud576875 が答えddたように、行く方法です。

楽しみのために、別の方法を次に示します。

str63=123456789.123456789.123456789.123456789.123456789.123456789.123
yes $str63 | head -134217728 > fill_me
于 2011-09-06T11:55:45.977 に答える
0

プログラミング エラーは既に見つかりましたが、シェル プログラミングの観点から見ると、スクリプト全体は非常に扱いにくいものになっています。ここにリファクタリングされたバージョンがあります。

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

COUNTCOUNT が 0 よりも大きくなるとすぐに終了するため、変数名とそれに基づいて実行した演算はかなり誤解を招きます。その場合は true/false フラグを使用することもできますが、ここではステータスを保存しません。変数で。代わりにbreak、終了条件が true の場合、ループ (したがって、スクリプト全体) から抜けます。

于 2011-09-06T12:06:45.410 に答える