web-dev-qa-db-ja.com

Bash:ifステートメントでdiffの結果を使用する

フォルダーが変更されたことを検出する単純なBashスクリプトを作成しています。

それは非常に近いものです:

ls -lR $dir > a
ls -lR $dir > b

DIFF=$(diff a b) 
if [ $DIFF -ne 0 ] 
then
    echo "The directory was modified"

残念ながら、ifステートメントはエラーを出力します:[:-ne:単項演算子が必要です

私のスクリプトの何が問題なのかわかりません。誰か助けてください。

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

ヤリー

50
Jary
ls -lR $dir > a
ls -lR $dir > b

DIFF=$(diff a b) 
if [ "$DIFF" != "" ] 
then
    echo "The directory was modified"
fi
45
Lou Franco
if ! diff -q a b &>/dev/null; then
  >&2 echo "different"
fi
49
Paul Tomblin

サンプルコードで使用しているdiffの出力ではなく、diffの戻り値を探しています。

これを試して:

diff a b
if [ $? -ne 0 ]; then
    echo "The directory was modified";
fi
25
tangens
_DIFF=$(diff -u <(find dir1/ -type f -printf '%P\n' | sort) <(find dir2/ -type f -printf '%P\n' | sort))
if [ "$DIFF" ]; then
  echo "Directories differ"
  # Do other stuff here
fi
_

これは、私のお気に入りのバシズムの1つである<()プロセス置換を使用します。

_$DIFF_変数には、印刷可能な差があります。エンドユーザーに表示する場合は、二重引用符で囲んでください。 _echo "$DIFF"_。

ユーザーにanyの違いのみを伝えたい場合は、[ "$(diff ...)" ] && echo "Difference found"のように短縮できる場合

:私は、元の質問が_dir1_と_dir2_を持っていることを意味していると仮定して、もう少し理にかなっています。時間0でdirであり、時間1でdirだった場合、このアプローチは明らかに機能しません。

1

変更内容を知る必要がない場合は、cmpで十分です。さらに、and ||によって提供される構文上のトリックで遊ぶことができます:

cmp a b || echo 'The directory was modified'

命令は、「aとbが等しいか、メッセージをエコーする」と解釈されます。

&&||のセマンティックは注意して処理する必要がありますが、ここでは直感的です)。

読みやすくするために、実際には2行に配置することを好みます。

cmp a b \
  || echo 'The directory was modified'
0