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.