2012-04-05 5 views
1

私はbashスクリプトの初心者で、次のような問題があります: findやgrepとオプションのパラメータで特定の文字列を含むファイルを検索できる検索スクリプトを作成しようとしています。すべての場合に条件に合致しない*文字が最後の問題で詰まっています。bashで* = '*'を作る方法は?

私のスクリプトに3つのパラメータがあります(必須)

  • ファイル名パターン(別売)
  • パス(オプション)

    • string_to_searchが

    例:

    ./search_text.sh 'string_to_search' 'file_name_pattern' /path 
    

    私はしたいトン以下:ファイル名パターンは*よりも何か他のものであるか、 '*' => + grepする

  • を見つけた場合

    • ファイル名パターンを指定するか(または引用符なし)*であるされていない場合=>
    • をgrepします

      #!/bin/bash 
      
      # ------------------------------------ 
      # Set default values for optional parameters (tests) 
      
      if [ ! -z $2 ] 
      then 
          FILE_TYPE=$2 
          echo 'FILE_TYPE : var 2' 
      else 
          FILE_TYPE="*" 
          echo 'FILE_TYPE : *' 
      fi 
      
      if [ ! -z $3 ] 
      then 
          LOCATION=$3 
          echo 'LOCATION : var 3' 
      else 
          LOCATION=. 
          echo 'LOCATION : .' 
      fi 
      
      # ------------------------------------ 
      # Do search/show conditions 
      
      if [ "$FILE_TYPE" == \* ]; 
          then 
          #grep -rn -C 0 --color=always "$1" $LOCATION | less -R; 
          echo ' => GREP'; 
          else 
          #find $LOCATION -iname $FILE_TYPE | sort | xargs grep "$1" --color=always -n 2>/dev/null | less -R; 
          echo '=> FIND'; 
      fi 
      

      ちょうどテストのための終わりに2つのエコーを表示するには、このコードを実行します。

      はここに私のコードです。

      今私の問題は、次のとおりです。言い換えれば

      ./search_text.sh 'string_to_search' '*.php' /path => works (FIND) 
      ./search_text.sh 'string_to_search' '*' /path  => works (GREP) 
      ./search_text.sh 'string_to_search' '*'   => works (GREP) 
      ./search_text.sh 'string_to_search' *    => ERROR => goes to FIND INSTEAD OF GREP :-(
      ./search_text.sh 'string_to_search'    => works (GREP) 
      

      どのように私は次の条件を記述することができます。

      if [ "$FILE_TYPE" == \* ]; 
      

      渡すときにその*は「*」と同じと考えるべきですこれらの値はコマンドラインのパラメータとして使用できますか?

      \ *条件で*をエスケープする場合でも、スクリプトに引用符を付けずに*を渡すだけでは一致しません。言い換えれば

      は、私が作りたいのです* * =「*」ように、他のコマンドのように、通常のワイルドカードとして任意の助け

      感謝を考慮すべき!

    +0

    AttilaとSorpigalの両方に感謝;-)まあ、私は、* charをエスケープして文字列として扱う簡単な方法があると思っていましたが、私は引用符でそれを使用します。 – user1186503

    答えて

    3

    あなたは

    を使用してすべてのグロブ展開を無効にすることができますその後
    set -o noglob 
    

    *は特別なものではありません。

    $ ls * 
    ls: *: No such file or directory 
    

    しかし、あなたのスクリプトを呼び出す前に、これを行うためにユーザーを強制する方法はありません。あなたのスクリプトではなくユーザのシェルがglobbingを制御するので、あなたは頼りにならないままになります。

    あなたの唯一のオプションは、それはそれがとにかくあるものですので、正確に

    ./search_text.sh 'string_to_search' file1 file2 
    

    よう

    ./search_text.sh 'string_to_search' * 
    

    を治療することになります。

    つまり、末尾のディレクトリが指定されておらず、$1がリテラルでない場合*grepケースを使用します。

    4

    *をbashに書き込むと、カレントディレクトリのファイルマッチングとして解釈されます。したがって、あなたのスクリプトは実際に./search_text.sh 'string_to_search' a.txt b.txtで呼び出されます(現在のdirtectoryには「a.txt」と「b.txt」という名前のファイルが2つしかないと仮定します)。 'a.txt'は '*'ではないので、あなたのfindコードが実行されます。あなたが行ったように - - それを防ぐために、私の知っている唯一の方法は、apostophes(')で囲むことで、またはバックスラッシュでエスケープ(「\」)

    関連する問題