como o echo reconhece, quando deve sair a lista de arquivos ou texto puro?

1

Eu encontrei essa pergunta no meu teste: Faça a saída de eco de todos os diretórios que começam com uma vogal (a, e, i, o, u, e), terminem com um número e tenham pelo menos 3 caracteres. Eu pensei que isso seria bastante fácil, mas logo acabei confuso e evitei o teste. Meu primeiro pensamento foi simplesmente:

echo {a,e,i,o,u,e}*{0..9}

Então eu tentei usar colchetes

echo [a,e,i,o,u,e]*[0..9]

e no final eu tentei algo assim:

echo $(ls {a,e,i,o,u,e}*{0..9})

que me deu a saída necessária, mas com algum diretório de erro faltando mensagens, e nem tenho certeza se ele não seria considerado trapaça como eu estou usando outra função para fazê-lo.

Alguém poderia me esclarecer, como faço isso e quando uso os colchetes? E eu também gostaria de saber como o echo reconhece quando deve sair a lista de diretórios em vez das minhas palavras exatas.

    
por Meio 21.10.2018 / 21:29

1 resposta

2

Para estender comentário do mosvy com esclarecimentos da roaima , eu sugiro:

echo [aeiou]?*[0-9]/

Isso usa recursos de expansão de nome de arquivo (globbing) para atender aos seus requisitos para:

  • um diretório ou link simbólico para o diretório (a barra à direita / )
  • que começa com uma vogal em minúsculas em inglês ( [aeiou] )
  • contém pelo menos um caractere adicional ( ? )
  • e tem pelo menos três caracteres ( * corresponderá a zero ou mais caracteres, somando-se aos dois que já correspondemos e ao que corresponderemos no final, abaixo)
  • termina com um dígito decimal ( [0-9] )

Seu shell expande todos os nomes de diretórios correspondentes e os transmite para echo , o que simplesmente os ecoa.

Note, porém, que com alguns shells incluindo bash , se houver nenhum diretórios correspondentes aos requisitos, seu shell deixará o padrão sozinho e passará diretamente para echo , o que será novamente ecoar, resultando nesta saída:

[aeiou]?*[0-9]/

Você pode ajustar isso um pouco no bash, definindo a opção "nullglob", que diz ao bash que quando não há correspondências (nulas) (globs), remove o padrão, nesse caso nada seria passado para echo , que então seria apenas imprimir uma linha em branco. Ou use a opção failglob para a falha na glob para acionar um erro.

    
por 22.10.2018 / 01:55