0
#! /bin/sh

if [ $# -ne 2 ]
then
    echo "Invalid argument count."
    echo "Usage: $0 <dir1> <dir2>"
    exit
fi

ls $1 >> dir1


for file in $2/*
do
        grep $file $dir1
done

rm $dir1

上記のスクリプトは、引数としてスクリプトに渡される名前を持つ 2 つのディレクトリにあるすべてのファイルを出力することを意図して作成しました。

しかし、スクリプトを実行すると、時間がかかりました。(実際には終わったことはありません!)

ここで私が間違ったことを知っている人はいますか?

ありがとう

4

2 に答える 2

1

$dir1 is not defined, so grep has only one argument and search $file in standard input. So grep is waiting input and it will wait forever.

于 2012-05-31T22:18:39.610 に答える
0

念のためにテストを設定する必要がありますが、 の値を設定することはなく、という名前のファイルに$dir1リダイレクトするだけ です。lsdir1

ではどうですか

#! /bin/sh

if [ $# -ne 2 ]
then
    echo "Invalid argument count."
    echo "Usage: $0 <dir1> <dir2>"
    exit
fi

ls $1 >> dir1


for file in $2/*
do
        grep $file dir1
done

rm dir1

明らかに期待される出力がなく、ただハングしているスクリプトを取得したとき。それを強制終了してから、シェルのデバッグ機能をスクリプトに追加します。

上部のいずれかのように

#!/bin/sh -vx

または、問題が疑われるスクリプト内の任意の場所、または 2 行目、つまり

set -vx

または、問題がどこにあるのかがよくわかっていて、上記でスクロールする必要があるものがたくさん生成される場合は、疑わしい行を分離して、デバッグのオンとオフを切り替えます。

set -vx
suspect_code
set +vx

最後に、あなたの問題は次のように減らすことができると思います

ls $1 >> dir1
ls $2/* | fgrep -f dir1 

ファイル/ディレクトリにスペース、CR、またはその他の厄介なものが埋め込まれている場合、これには制限があります。きれいなファイル名があれば、うまくいくはずです。

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

于 2012-05-31T22:08:59.853 に答える