
Estoy ampliando la siguiente función para incluir la opción -i | --ignore-case
con manejo de errores
#!/bin/sh
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -
código ampliado
#!/bin/sh
################################
# Check if parameters options #
# are given on the commandline #
################################
while (( "$#" )); do
case "$1" in
-h | --help)
echo "help menu"
exit 0
;;
-i | --ignore-case)
[ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -
exit 0
;;
-*)
echo "Error: Unknown option: $1" >&2
exit 1
;;
*) # No more options
break
;;
esac
shift # not sure if needed
done
# Do this if no cases chosen
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -l "$1" {} + | vim -
Resultado
haetex "TODO"
. La producción esperada es la misma que la producción. ¡Aprobado!haetex -i "TODO"
. Resultado esperado: búsqueda con ignorar mayúsculas y minúsculas. Resultado: archivo en blanco.
¿Por qué la opción -i
no funciona aquí?
Respuesta1
Cambie el grep
caso -i
para buscar $2
, ya que $1
contiene la opción que acaba de probar, no la cadena de búsqueda.
find $HOME -type f -name "*.tex" -exec grep -il "$2" {} + | vim -
Para manejar múltiples opciones, sería mejor que la case
declaración simplemente establezca una variable, por ejemplo
-i | --ignore-case)
[ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
case_option=-i
;;
Entonces el find
comando después del bucle se vería así:
find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -
En este caso se puede utilizar $1
porque shift
ha movido la cadena de búsqueda al principio de los argumentos.
Entonces todo el guión se ve así:
while (( "$#" )); do
case "$1" in
-h | --help)
echo "help menu"
exit 0
;;
-i | --ignore-case)
[ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
case_option=-i
;;
-*)
echo "Error: Unknown option: $1" >&2
exit 1
;;
*) # No more options
break
;;
esac
shift # not sure if needed
done
find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -