1

指定されたサイズ制限 (この場合は 1GB) までファイルをあるディレクトリから別のディレクトリに移動するように、bash スクリプトのセットアップを取得しようとしています。ループに入るようにしようとしていますが、while ステートメントに問題があります。以下の出力を返し続けますが、その理由はわかりません。「$ currentSize」を使用しようとすると、bashは整数比較を期待していると言っています。しかし、bash の変数は型指定されていないはずなので、intiger にキャストすることはできませんよね? 任意のヘルプが割り当てられます。

出力

54585096

1048576
./dbsFill.bsh: line 9: [: -lt: unary operator expected

コード

#!/bin/bash

currentSize= du -s /root/Dropbox | cut -f 1
maxFillSize=1048576
echo $currentSize
echo $maxFillSize

cd /srv/fs/toSort/sortBackup
while [ $currentSize -lt $maxFillSize ]

do
        #fileToMove= ls -1
        #rsync -barv --remove-source-files $fileToMove /root/Dropbox/sortme
#       mv -t /root/Dropbox/sortme $(ls -1 | head -n 1)
        #find . -type f -exec mv -t /root/Dropbox/sortme {} \;
        #currentSize= du -s /root/Dropbox | cut -f 1
#       sleep 5
        echo Were are here
done
4

3 に答える 3

3

あなたが達成しようとしていること:

currentSize= du -s /root/Dropbox | cut -f 1

/root/Dropboxinの現在のサイズを取得することcurrentSizeです。それは起こっていません。これは、シェル変数を設定するときに空白が重要であるため、次の違いがあります。

myVar=foo

myVar= foo

後者はfoo、環境変数myVarを何も設定せずに評価しようとします。

結論:currentSize何も設定されず、9 行目は次のようになりました。

while [ -lt 1048576 ]

そしてもちろん、-ltシェルがその状況で期待しているものである単項演算子ではありません。

意図を達成するには、Bash コマンド置換を使用します。

currentSize=$( du -s /root/Dropbox | cut -f 1 )
于 2012-06-20T18:34:42.427 に答える
1
currentSize= du -s /root/Dropbox | cut -f 1

これは、あなたが思っていることをしません。

currentSize=$(du -s /root/Dropbox | cut -f 1)
于 2012-06-20T18:24:31.950 に答える
0

「currentSize ...」行を次のように書き直す必要があります

currentSize=$(du-s /root/Dropbox | cut -f 1)

あなたのコードは currentSize の値を空のままにしました。

このような問題は (少し練習すれば) 見つけることができますが、シェルのデバッグ機能を使用すると

set -vx

をスクリプトの先頭に追加するか、どこに問題があるかがはっきりしている場合は、疑わしいコードを次のように囲みます。

set -vx
myProblematicCode
set +vx

( はset +vxデバッグ モードをオフにします。)

これが役立つことを願っています。

于 2012-06-20T18:25:45.480 に答える