3

入力に応じて、別のスクリプトを呼び出して 1 回またはループで使用するスクリプトを作成しようとしています。

ファイルでパターンを検索し、ファイル名を出力して、検索が見つかった行を一覧表示するスクリプトを作成しました。そのスクリプトはこちら

#!/bin/bash

if [[ $# < 2 ]]
then
  echo "error: must provide 2 arguments."
  exit -1
fi

if [[ -e $2 ]]
then
    echo "error: second argument must be a file."
    exit -2
fi

echo "------ File =" $2 "------"
grep -ne $1 $2

そこで、これを呼び出す新しいスクリプトを書きたいと思います。これは、ユーザーが 2 番目の引数としてファイルを 1 つだけ入力し、ディレクトリを選択すると、ディレクトリ内のすべてのファイルをループして検索します。

したがって、入力が次の場合:

./searchscript if testfile

スクリプトを使用するだけですが、入力が次の場合:

./searchscript if Desktop

ループ内のすべてのファイルを検索します。

いつものように、私の心は皆さんのために走っています。

4

4 に答える 4

1

ええと...単純すぎるかもしれませんが、「grep」にすべての作業を任せるのはどうですか?

#myscript
if [ $# -lt 2 ]
then
  echo "error: must provide 2 arguments."
  exit -1
fi

if [ -e "$2" ]
then
    echo "error: second argument must be a file."
    exit -2
fi
echo "------ File =" $2 "------"
grep -rne "$1" "$2"  

「-r」をgrep呼び出しに追加しました。ファイルの場合は再帰なし、ディレクトリの場合は再帰します。

引数チェックを取り除き、grep barf に適切なエラー メッセージを表示させることもできます: (引用符を保持しないと失敗します)

#myscript
grep -rne "$1" "$2"  
于 2013-06-20T19:29:32.620 に答える
1

これはどう:

#!/bin/bash

dirSearch() {
   for file in $(find $2 -type f) 
   do 
      ./searchscript $file
   done
}

if [ -d $2 ]
then
    dirSearch
elif [ -e $2 ]
then
    ./searchscript $2
fi

または、 find の出力を解析したくない場合は、次のようにします。

#!/bin/bash

if [ -d $2 ]
then
   find $2 -type f -exec ./searchscript {} \;
elif [ -e $2 ]
then
   ./searchscript $2
fi
于 2013-06-20T18:18:20.917 に答える
0

再帰的に検索したくないと仮定すると:

#!/bin/bash

location=shift

if [[ -d $location ]]
then
   for file in $location/*
   do
       your_script $file
   done
else 
   # Insert a check for whether $location is a real file and exists, if needed
   your_script $location 
fi

注1:これには微妙なバグがあります:ディレクトリ内の一部のファイルが「。」で始まる場合、私が思い出す限り、「for *」ループはそれらを認識しないため、"in $location/* $location/.*"代わりに追加する必要があります

注 2: 再帰的な検索が必要な場合は、代わりに find を使用します。

in `find $location`
于 2013-06-20T18:14:37.077 に答える