1

私は bash を初めて使用し、ファイルを検索するために独自の grep エイリアスを作成しようとしています。作成したスクリプトは次のとおりです。

function gia() {
  if [ -z "$1" ]; then
    echo "-You need to define what are you looking for-"
  else
    echo "-Looking for \"$1\".-"
    if [ -z $2 ]; then
      echo "-no path passed, searching all files-"
      grep -i --color "$1" ./*
    else
      echo "-Looking in \"$2\".-"
      grep -i --color "$1" $2
    fi
  fi
}

2番目のオプションはうまく機能しません。試してみると、次の出力が得られます。

$$ gia 'sometext' ./*.html
-Looking for "sometext".-
-Looking in "./login.html".-

login.htmlを指定したことはありませんが、ディレクトリ内のファイルの 1 つを取得して検索しました。そしてgrepは失敗します。

たとえば、myfilesディレクトリに 3 つのファイルがある場合:

1.html2.txtおよび3.html

3.htmlには「バッククォート」というテキストがあります

このように検索すると:

cd myfiles
gia 'backquotes'

私は結果を得る

-Looking for "backquotes".-
-no path passed, searching all files-
./3.html:    <backquotes>...</backquotes>

しかし、私がルートにいて、次のように検索した場合:

gia 'backquotes' ~/myfiles/*.html

私はこれを得る:

-Looking for "backquotes".-
-Looking in "./1.html".-

1.html のみを検索したため、結果は返されませんでした。1.html に「逆引用符」があるとします。戻ってきますが、他のファイルからは何も得られません。最初のファイルを検索して終了するだけです。

星がbashの特殊文字であることは知っていますが、どうすればこれを解決できますか?

事前にご協力いただきありがとうございます。

EMMNS

4

2 に答える 2

2

関数に「ワイルドカード」ファイル名を使用する場合は、$@ を解析する必要があります。これは、関数へのパラメーターのリストです。今のところ、このソリューションからパスの解析を残しました。

function gia() {
  if [ -z "$1" ]; then
    echo "-You need to define what are you looking for-"
  else
      for f in $@
      do
         grep -i --color "$f" ./*
      done
    fi
  fi
}
于 2013-03-27T18:31:26.187 に答える
2

表記法$@を使用して、2 番目から始まるすべての引数をスプライスできます。また、ファイル名にはエスケープが必要なスペースや特殊文字が含まれている可能性があるため、を${@:2}引用してください。"${@:2}"

これはうまくいくはずです:

function gia() {
if [ -z "$1" ]; then
    echo "-You need to define what are you looking for-"
else
    echo "-Looking for \"$1\".-"
    if [ -z $2 ]; then
        echo "-no path passed, searching all files-"
        grep -i --color "$1" ./*
    else
        echo "-Looking in \"${@:2}\".-"
        grep -i --color "$1" "${@:2}"
    fi
fi
}

出力:

$ gia ABC file*.html
-Looking for "ABC".-
-Looking in "file1.html file 2.html file 3.html file4.html file5.html".-
file 2.html:ABC
file 3.html:ABC
file5.html:ABC
于 2013-03-27T20:22:38.390 に答える