Algumas coisas estão erradas no seu código:
Usando a substituição de comando sem aspas ( $(...) ) sem definir $IFS
Deixar expansões sem aspas é o operador split + glob. O padrão é dividir no espaço, na guia e na nova linha. Aqui, você só quer dividir em nova linha, então você precisa definir o IFS para que, caso contrário, isso significa que não funcionará corretamente se os nomes de arquivos contiverem espaços ou caracteres de tabulação
Usando a substituição de comando sem aspas, sem set -f .
Deixar expansões sem aspas é o operador split + glob. Aqui você não quer globbing, que é a expansão de curingas como scala* na lista de arquivos correspondentes. Quando você não quer que o shell faça globbing, você tem que desabilitá-lo com set -f
ls aliased para ls -F
O problema acima é agravado pelo fato de você ter ls aliased para ls -F . Que adiciona / aos diretórios e * aos arquivos executáveis. Portanto, normalmente, porque scala é executável, ls -F outputs scala* e como um padrão globbing, ele é expandido para todos os nomes de arquivos que começam com scala , o que explica porque parece que egrep -v não está filtrando arquivos fora.
Supondo que nomes de arquivo não contenham caracteres de nova linha
newline é um caractere tão válido quanto qualquer outro em um nome de arquivo. Portanto, analisar a saída de ls normalmente não funciona . Por exemplo, a saída de ls em um diretório que contém a e b files é a mesma que em um diretório que contém um arquivo chamado a\nb .
Acima de egrep filtrará as linhas dos nomes de arquivos, não os nomes de arquivos
Usando egrep em vez de grep -E
egrep está obsoleto. grep -E é o equivalente padrão.
Não está escapando do operador . regex.
Acima, você usou egrep para ativar expressões regulares estendidas , mas não usa nenhum dos operadores específicos de RE estendidos. O único operador de RE que você está usando é . para corresponder a qualquer caractere, embora pareça que não é isso que você pretendia. Então você pode também ter usado grep -F aqui. Ou use grep -v '\.bat' .
Não ancora o regexp no fim de linha
egrep .bat corresponderá a qualquer linha que contenha qualquer caractere seguido por bat , então esse é o regexp que significa qualquer coisa que contenha bat não na primeira posição. Deve ter sido grep -v '\.bat$' .
Deixando $f sem aspas
Deixar uma expansão sem aspas é o operador split + glob. Lá, você não quer nem, então $f deve ser citado ( "$f" ).
Use echo
echo expande as sequências de escape ANSI C nos seus argumentos e / ou trata cadeias como -n ou -e especialmente dependendo da implementação echo (e / ou do ambiente).
Então, uma solução melhor:
for f in *; do
case $f in
(*.bat);;
(*) printf '%s\n' "$f"
esac
done
No entanto, se não houver nenhum arquivo não oculto no diretório atual, isso ainda gerará * . Você pode contornar isso em zsh alterando * para *(N) ou em bash executando shopt -s nullglob .