Vamos contar o número de erros em:
FILENAME=$(echo $INFILE | grep -oE "[^/]+$")
-
echo
não deve ser usado para dados arbitrários . Dependendo da implementação, ele falhará se $INFILE
começar com -
ou contiver barras invertidas ou ambas.
-
Deixar uma variável sem aspas é o operador split + glob . Isso fará com que o acima falhe por muitos valores possíveis de
$INFILE
. As variáveis nunca devem ser deixadas sem aspas, a menos que você tenha uma boa razão para não fazê-lo.
-
grep
funciona em cada linha de sua entrada, enquanto aqui você quer que ele faça apenas a cadeia inteira.
- Se
$INFILE
for /some/dir/
ou /
, isso retornará a string vazia em vez de dir
ou /
.
- A opção
-o
é específica do GNU, então só funcionará onde grep
é o GNU grep
.
- cosmético / convenção: todos os nomes de variáveis de letras maiúsculas devem ser reservados para variáveis de ambiente.
A substituição de comandos - remove os caracteres de nova linha à direita, portanto, o acima não funcionará se
$INFILE
terminar em caracteres de nova linha.
Para obter o nome base de um arquivo, há um comando padrão para isso:
filename=$(basename -- "$infile")
Ou para evitar (7) acima:
filename=$(basename -- "$infile"; echo .); filename=${filename%??}
Ou usando operadores de expansão de shell:
filename=${infile##*/}
(ainda tem problema (4) acima).