Como outros apontaram, você tem erros lógicos e erros de sintaxe no seu código. O site do ShellCheck é bom para eliminar os erros de sintaxe.
Aqui está minha opinião sobre isso. Eu tenho duas versões do código. O primeiro (que eu prefiro) não tem interação com o usuário, mas recebe um nome de caminho na linha de comando. O segundo interativamente pede um nome de caminho.
A razão pela qual o primeiro não interativamente solicita um nome de caminho é que faz pouca diferença se o usuário do script gravar o nome do caminho na linha de comando ou no prompt do seu script, e ter o prompt de script para o nome do caminho desclassificado de ser usado por exemplo um cron job ou qualquer outro lugar onde não haja um terminal conectado.
#!/bin/sh
pathname=$1
if ! grep 'pattern' <$pathname >i2; then
echo 'Something is wrong' >&2
fi
O echo
acima será executado quando
- o arquivo em
$pathname
não pode ser lido ou
- o arquivo
i2
não pode ser gravado ou
- o padrão não foi encontrado em
$pathname
(isso é diferente do seu código, mas veja abaixo).
A mensagem de erro é gravada no erro padrão, como é costume nas mensagens de diagnóstico em geral.
Com aviso e atraso interativos:
#!/bin/bash
while true; do
read -r -p 'Pathname: ' pathname
if grep 'pattern' <$pathname >i2; then
break
fi
echo 'Something is wrong' >&2
sleep 3
done
Aqui, temos um loop infinito que lê o usuário e sai do loop se a chamada grep
foi ok. Se grep
falhar por qualquer motivo (uma das três razões acima), o nome do caminho será solicitado novamente.
Ambos os trechos de código com um teste separado para um arquivo legível (o grep
tem permissão para falhar por não encontrar nada ou não conseguir gravar em seu arquivo de saída.
Primeiro, a versão não interativa:
#!/bin/sh
pathname=$1
if [ ! -r "$pathname" ]; then
echo 'Something is wrong' >&2
fi
grep 'pattern' <$pathname >i2
Em seguida, a versão interativa:
#!/bin/bash
while true; do
read -r -p 'Pathname: ' pathname
if [ -r "$pathname" ]; then
grep 'pattern' <$pathname >i2
break
fi
echo 'Something is wrong' >&2
sleep 3
done
Ou uma versão interativa em que o loop lida apenas com entrada e validação do usuário:
#!/bin/bash
while true; do
read -r -p 'Pathname: ' pathname
[ -r "$pathname" ] && break
echo 'Something is wrong' >&2
sleep 3
done
grep 'pattern' <$pathname >i2