- O caractere (ou conjunto ou intervalo) a ser excluído é fornecido pelo argumento
-r
flags, portanto, não há necessidade deread
it. - O nome do arquivo (se houver) é deixado no argumento posicional após o processamento da linha de comando.
- Não processe o arquivo quando você ainda não tiver terminado o processamento dos sinalizadores de linha de comando.
- A string da opção para
getopts
está para trás.
Solução:
#!/bin/bash
# Process command line.
# Store r-flag's argument in ch,
# Exit on invalid flags.
while getopts 'r:' opt; do
case "$opt" in
r) ch="$OPTARG" ;;
*) echo 'Error' >&2
exit 1 ;;
esac
done
# Make sure we got r-flag.
if [[ -z "$ch" ]]; then
echo 'Missing -r flag' >&2
exit 1
fi
# Shift positional parameters so that first non-flag argument
# is left in $1.
shift "$(( OPTIND - 1 ))"
if [[ -f "$1" ]] || [[ -z "$1" ]]; then
# $1 is a (regular) file, or unset.
# Use file for input, or stdin if unset.
cat "${1:--}" | tr -d "$ch"
else
# $1 is set, but not a filename, pass it as string to tr.
tr -d "$ch" <<<"$1"
fi
Isso seria usado como
$ ./script -r 'a-z' file
(exclui todos os caracteres minúsculos em file
)
$ ./script -r 'a-z' "Hello World!"
(apaga todos os caracteres minúsculos na string dada, a menos que seja um nome de arquivo )
$ ./script -r 'a-z'
(exclui todos os caracteres minúsculos no fluxo de entrada padrão)