Como pesquisar com base em um $ OPTARG que eu forneci em um arquivo?

0

Eu estou tentando fazer um arquivo executável para pesquisar um texto específico. Eu quero recuperar qualquer linha no meu arquivo de dados que inclua o valor que eu passá-lo. Então criei um arquivo de dados chamado .addr_book e criei um arquivo executável chamado lookup.ksh

lookuo.ksh:

#!/bin/ksh

while getopts ":a:" option;
do
 case $option in
  a)
   echo searching for $OPTARG
   cat .addr_book | grep -o '$OPTARG.*' 
   ;;
  *)
   echo "invalid option -$OPTARG"
   ;;
 esac
done

quando executo o arquivo como ./lookup.ksh -a test Apenas mostrará: searching for test

Acho que cat .addr_book | grep -o '$OPTARG.*' tem um problema.

Qualquer ajuda seria apreciada

    
por Christiano 26.03.2018 / 23:57

1 resposta

0

Quando você usa aspas simples em torno de uma expansão de variável, impede que o shell expanda essa variável. Você deve usar aspas duplas.

Aqui está uma sugestão para melhoria:

#!/bin/sh

while getopts "a:" option; do
   case $option in
       a) word=$OPTARG ;;
       *) echo 'error' >&2
          exit 1
   esac
done

if [ -z "$word" ]; then
    echo 'Missing word to search for' >&2
    exit 1
fi

printf 'Searching for "%s"\n' "$word"
grep -o "$word.*" .addr_book

Eu fiz algumas alterações:

  • O script não está usando os recursos ksh -específicos, por isso criei um script /bin/sh .
  • Separei a análise da linha de comando da parte principal do script (o grep ). Isso torna o script mais fácil de manter.
  • O : inicial na string getopts informa ao getopts que você manipulará o argumento de linha de comando inválido. Isso raramente é necessário, pois as mensagens de diagnóstico de getopts geralmente são adequadas.
  • Mensagens de diagnóstico (qualquer coisa que não faça parte da saída normal do script, como mensagens de erro ou avisos) deve ir para o fluxo de erros padrão ( >&2 ).
  • Uma mensagem de diagnóstico é gerada se a palavra a procurar estiver ausente ou vazia.
  • A saída de dados variáveis deve ser feita com printf .
  • cat foi removido.
por 30.03.2018 / 20:47