Remover citações de
files='find '$rep' -type f'
O script correto é
#!/bin/bash rep="git" files='find $rep -type f' for f in ${files}; do echo $f done
Onde está o erro neste script, por favor:
#!/bin/bash
rep="git"
files='find' ${rep} '-type f'
for f in ${files} do
echo $f
done
Quando eu executo find git -type f
sozinho no shell, funciona!
As strings entre aspas simples não são interpoladas. Isso significa que você está tentando executar
find ' ${rep} '-type f
Remova as aspas simples. Se você realmente precisar citar o $ rep (por exemplo, porque ele contém espaços), use aspas duplas:
files='find "$rep" -type f'
Observe que não há espaços dentro das aspas duplas. Você está pesquisando 'git', não 'git', certo?
Não armazene a saída de find
em uma variável. Não é confiável e ineficiente. Ineficiente, porque find
precisa terminar a execução antes de você começar a processar sua saída; isso faz diferença em uma árvore de diretórios grande. Não confiável porque mesmo se você tiver a sintaxe de comando correta, a saída de find
consistirá em uma lista de nomes de arquivos separados por novas linhas. Isso é ambíguo, a menos que os nomes dos arquivos sejam conhecidos por não conter novas linhas. Além disso, você não está analisando a saída corretamente: com uma substituição de comando sem aspas $(…)
, o resultado do comando é dividido em palavras separadas onde houver espaço em branco (não apenas novas linhas) e as palavras são interpretadas como padrões de globalização. Para evitar esse processamento, use "$(…)"
(sempre coloque aspas duplas em torno das substituições de variáveis e comandos: "$foo"
, "$(foo)"
); isso não é bom aqui, já que você precisa separar os nomes dos arquivos.
find
tem um recurso interno para processar os arquivos resultantes: a ação -exec
. Use-o. É para isso que é.
find "$rep" -type f -exec echo {} \;
Se você precisar executar um fragmento de shell arbitrário e não apenas um único comando em cada arquivo, invoque um shell como o comando. Para evitar desconfigurar o nome do arquivo, passe-o como um parâmetro para o shell.
find "$rep" -type f -exec sh -c '
echo "$0"
# more shell commands ...
' {} \;
Adicione espaço após '
e antes de -type