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
.