Estou tendo problemas para entender o básico dos scripts do Bash. Aqui está o que eu tenho até agora:
#!/bin/bash
FILES="/home/john/my directory/*.txt"
for f in "${FILES}"
do
echo "${f}"
done
Tudo o que eu quero fazer é listar todas as .txt
arquivos em um for
loop para que eu possa fazer coisas com eles. Mas o espaço no my directory
e o asterisco *.txt
simplesmente não estão funcionando bem. Tentei usá-lo com e sem aspas duplas, com e sem chaves nos nomes das variáveis e ainda não consigo imprimir todos os .txt
arquivos.
Isso é uma coisa muito básica, mas ainda estou lutando porque estou cansada e não consigo pensar direito.
O que estou fazendo errado?
Consegui aplicar com êxito o script acima se meus ARQUIVOS não tiverem espaço ou asterisco ... tive que experimentar com ou sem o uso de aspas duplas e chaves para fazê-lo funcionar. Mas no momento em que tenho espaços e um asterisco, tudo estraga tudo.
for f in "$DIR"/*.txt
= finafor f in "$DIR/*.txt"
= breaksEmbora o uso de matrizes, como mostrado por John1024, faça muito mais sentido, aqui também é possível usar o operador split + glob (deixando uma variável escalar sem aspas).
Como você deseja apenas a parte global desse operador, é necessário desativar a parte dividida :
fonte
O que você pode fazer é deixar apenas os caracteres curinga fora das aspas.
Algo como:
um em "arquivos com espaços" * "txt"
que
o processamento
feito
Se os próprios wildcards expandir a espaços, então você precisa t usar um arquivo por abordagem de linha, como o uso ls -l para gerar a lista de arquivos e use o bash read para obter cada arquivo.
fonte
Quando você deseja processar um conjunto de arquivos, considere que, em seu nome, pode haver espaço ou outro código scape estará presente. Portanto, antes de iniciar seu processo, como
for loop
oufind command
defina o seguinteIFS bash env variable
:fonte