Por que esta opção não está funcionando neste script Bash?

0

Estou expandindo a seguinte função para incluir a opção -i | --ignore-case com tratamento de erros

#!/bin/sh
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -

Código expandido

#!/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. %código%. A saída esperada é igual à saída. Passou!
  2. %código%. Resultado esperado: pesquise com ignore-case. Resultado: arquivo em branco.

Por que a opção haetex "TODO" não está funcionando aqui?

    
por Léo Léopold Hertz 준영 16.05.2016 / 16:55

1 resposta

1

Altere o grep no caso -i para pesquisar $2 , pois $1 contém a opção que você acabou de testar, não a sequência de pesquisa.

find $HOME -type f -name "*.tex" -exec grep -il "$2" {} + | vim -

Para lidar com várias opções, seria melhor que a declaração case apenas definisse uma variável, por exemplo

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

Em seguida, o comando find após o loop seria semelhante:

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

Nesse caso, ele pode usar $1 porque o shift moveu a string de pesquisa para o começo dos argumentos.

Assim, todo o script se parece com:

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 -
    
por 16.05.2016 / 17:31