La commande "grep" qui recherche une chaîne dans un fichier. Je pense que c'est utilisé assez souvent, mais ce n'est pas très gentil. Il est trop doux et a tendance à être utilisé en combinaison avec la commande «trouver». Pour «trouver», cela a tendance à rendre la ligne de commande longue, donc j'ai pensé que je devrais la compléter avec un script shell.
Tout d'abord, décidez de l'état par défaut.
C'est pourquoi je vais le mettre en œuvre.
En parlant de traitement des options dans bash, il s'agit de "get opts", mais l'un des inconvénients est que "les options ne peuvent pas être spécifiées après des arguments autres que des options". Cependant, lorsque getopts propose une option non valide, il arrête simplement le traitement et il est correctement stocké dans l'argument option. Alors
Sous la forme de, vous pouvez mélanger des options et des arguments sans option.
Lorsque grep, la plupart des fichiers du répertoire sont ciblés, spécifiez donc essentiellement le fichier comme "" (caractère générique). Si aucun répertoire n'est spécifié, le répertoire courant "" est ciblé, et si un répertoire est spécifié, ce répertoire "*" est ciblé. Cependant, comme il est pratique de ne pouvoir spécifier que le type de fichier, nous avons rendu possible la spécification de "l'extension".
Et voici le résultat.
#!/usr/bin/env bash
CMD=`basename $0`
#=============================================================================
# error handler
#La gestion des erreurs
#=============================================================================
function error() {
  case ${1} in
    [12] )
      echo "Usage:"
      echo "$CMD [-r] [-e ext] [other grep option] search_string [search_directory]"
      echo "-r    : Recursive"
      echo "-e ext: Limits the search to files with the specified extension."
      echo ""
      ;;
    [34] )
      echo "require option parameter."
      echo ""
      ;;
    [5] )
      echo "invalid option - '${2}'"
      echo ""
      ;;
  esac
  exit
}
#=============================================================================
# option procedure
#Contrôle optionnel
#=============================================================================
function optproc() {
  local OPT OPTARG
  OPT=$1
  OPTARG=$2
  case $OPT in
    [e] )
      if [ -z "$OPTARG" ] || [ ${OPTARG:0:1} = "-" ]; then
        error 3
      else
        OPTION="$OPTION --include *.$OPTARG"
      fi
      ;;
    [r] )
      RECURSIVE="-R"
      TARGET=""
      ;;
    [C] )
      if [ -z "$OPTARG" ] || [ ${OPTARG:0:1} = "-" ]; then
        error 4
      else
        OPTION="$OPTION -C$OPTARG"
      fi
      ;;
    [\?] )
      error 5 $OPTARG
      ;;
    [:] )
      ;;
    * )
      OPTION="$OPTION -$OPT"
      ;;
  esac
}
#=============================================================================
# main procedure
#Traitement principal
#=============================================================================
#---------------------------
# exec without option
#Courir sans options
#---------------------------
if [ -z "${1}" ]; then
  error 1
fi
#---------------------------
# variable
#variable
#---------------------------
COMMAND="/usr/bin/env grep"
OPTION="--color=auto -Isn"
RECURSIVE=""
TARGET="*"
SEARCH=""
#---------------------------
# option loop
#Boucle optionnelle
#---------------------------
arg="-"
argarr=()
#---------------------------
# valid option
#Options valides
#---------------------------
option=":lvire:C:VcLo"
IFS=$'\n'
while [ ! -z $arg ]; do
  while getopts $option OPT; do
    optproc $OPT $OPTARG
  done
  num="$(($OPTIND-1))"
  shift $num
  arg=$1
  if [ ! -z "$arg" ]; then
    argarr+=($arg)
    OPTIND=1
    shift
  fi
done
SEARCH=${argarr[0]}
if [ -z $SEARCH ]; then
  error 4
fi
num=${#argarr[*]}
DIRTMP=""
for i in $(seq $num); do
  argstr=${argarr[$i]}
  if [ ! -z "$argstr" ]; then
    DIRTMP="$DIRTMP $argstr"
  fi
done
IFS=$'  '
if [ ! -z "$DIRTMP" ]; then
  DIRECTORY=${DIRTMP%/}
  TARGET="$DIRECTORY/$TARGET"
fi
$COMMAND $SEARCH $RECURSIVE $OPTION $TARGET
Il est assez polyvalent, veuillez donc l'utiliser comme modèle pour les scripts shell.