Como mencionado, o find geralmente é a ferramenta correta ao manipular arquivos. No entanto, pode ser perfeitamente OK.
Você pode pular esta parte do printf , se quiser, apenas incluí-lo como um bônus : P
Uma coisa que você também pode começar a usar é printf . Geralmente, é uma opção melhor do que echo . Na sua forma mais simples você tem:
printf "Some text\n"
em que \n é nova linha. Se você quiser imprimir alguma variável você pode usar o símbolo especial %s (para string):
printf "Name is %s \n" "$name"
| |
| +---- value
+---------------- format string
printf "Name is %s city is %s \n" "$name" "$city"
| | |
| +-------+----- values
+------------------------------------ format string
Existem outros símbolos que você pode usar, como %d (para dígito). Você também pode usar outros caracteres especiais, como \t (guia).
Para o seu código, geralmente é melhor usar o mais recente $(cmd) em vez de '' cmd '. Em seu código isso seria:
$(ls *.txt)
A próxima coisa a observar é o loop for . Sua declaração
for n in 'ls *.txt'; do
não faz o que você pensa. Aqui n é tratado como um nome de variável ao qual o resultado de ls *.txt é atribuído. Se você tiver os arquivos:
a.txt
b.txt
c.txt
A execução do código se expandirá para:
for n in a.txt b.txt c.txt; do
Ou seja: para cada iteração, n é definido para o próximo nome de arquivo. Você acaba com:
n=a.txt (first loop)
n=b.txt (second loop)
n=c.txt (last loop)
Se coletarmos isso juntos, podemos, por exemplo, escrever algo assim:
#!/bin/bash
printf "Write the file extension you want to search for: "
read ext
printf "Searching for files with extension '%s'\n" "$ext"
for file in *"$ext"; do
printf "File: %s\n" "$file"
done
Ou você pode simplesmente dizer:
ls *"$ext"
Note que o asterisco está fora das aspas. Senão não se expandirá.