3

コードの下の質問。

#!/bin/sh

check() {   
    dir="$1"
    chsum1=`find ~/folder -type f -exec cat {} \; | md5` 
    chsum2=$chsum1

    for (( ; 0x$chsum1 == 0x$chsum2;  ))
    do
        echo "hello"
        sleep 10
        chsum2=`find ~/folder -type f -exec cat {} \; | md5`
    done

echo "hello"
#eval $2
}

check $*

目標は: コードを機能させることです。それは何をしますか?md5 をフォルダーに適用し、md5 値を比較します。値が異なるまでループを維持します (つまり、フォルダーで何かが発生したことを意味します)。したがって、md5 がハッシュを計算する 10 秒後に異なるはずであり、コードは終了します。

2 つの質問

  1. そこにコメントがあることに注意してください。while のコメントを外し、for のコメントを外すと、コードが機能しなくなることがわかります。なんで?それを機能させるために、さまざまな組み合わせを試しました。引用符で囲み、-eq、=、== などを使用しました。どれも機能しませんでした。どうすればそれを全体で機能させることができますか?
  2. 現在のコードの方法は、実行された場合、出力として得られるものは次のとおりです。

((: d41d8cd98f00b204e9800998ecf8427e == 97329acaae00bdf66e30ac53b49e10​​36: ベースに対して値が大きすぎます (エラートークンは「97329acaae00bdf66e30ac53b49e10​​36」です)

Thus, how can I fix this is the second question and why this is happening.

ありがとうございました!

4

3 に答える 3

2

(更新された)投稿されたコードで発生している問題は、ループが機能forするときにwhileループを使用していることです。

次のコードは私にとってはうまくいきます。forループをループに変更しただけwhileです。

#!/bin/sh

check() {
        dir="$1"
        chsum1=`find ~/NASAtest -type f -exec cat {} \; | md5`
        chsum2=$chsum1

        while [ $chsum1 == $chsum2 ]
        do
                echo "hello"
                sleep 10
                chsum2=`find ~/NASAtest -type f -exec cat {} \; | md5`
        done

        echo "hello"
        #eval $2
}

check $*

while ループが機能しなかった理由は、角かっこと式の間にスペースがなかったためです。

于 2012-06-05T05:07:14.847 に答える
1

値の前に Z を置き、文字列として比較することで、比較している変数の形式または型 (基数に対して値が大きすぎる) に関する混乱を解消できます。

# read or operation to define $file1 & $file2 here ...
  val1=`md5sum ${file1} | awk '{print $1}'`
  val2=`md5sum ${file2} | awk '{print $1}'`
  tmpval="Z${val1}" ; val1="${tmpval}"
  tmpval="Z${val2}" ; val2="${tmpval}"
  if [[ "$val1" -eq "$val2" ]] ; then
    # files are the same, do operation here ..
  fi
done
于 2014-01-13T22:20:17.083 に答える
0

while [$chsum1 == $chsum2] do いくつかの処理を実行 end

これは次のようにする必要があります (改行を含む)

while [ $chsum1 == $chsum2 ]
do
 (perform some stuff)
done

doの代わりに角括弧と/doneブロックの周りのスペースに注意してくださいend

于 2012-06-05T05:08:05.223 に答える