¿Por qué esta opción no funciona en este script Bash?

¿Por qué esta opción no funciona en este script Bash?

Estoy ampliando la siguiente función para incluir la opción -i | --ignore-casecon 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

  1. haetex "TODO". La producción esperada es la misma que la producción. ¡Aprobado!
  2. haetex -i "TODO". Resultado esperado: búsqueda con ignorar mayúsculas y minúsculas. Resultado: archivo en blanco.

¿Por qué la opción -ino funciona aquí?

Respuesta1

Cambie el grepcaso -ipara buscar $2, ya que $1contiene 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 casedeclaración simplemente establezca una variable, por ejemplo

-i | --ignore-case)
    [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
    case_option=-i
    ;;

Entonces el findcomando 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 $1porque shiftha 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 -

información relacionada