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 stringgetopts
informa aogetopts
que você manipulará o argumento de linha de comando inválido. Isso raramente é necessário, pois as mensagens de diagnóstico degetopts
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.