Erro de sintaxe em um script bash que chama find

1

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!

    
por user15992 10.10.2012 / 12:29

4 respostas

1

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

    
por 10.10.2012 / 12:49
6

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?

    
por 10.10.2012 / 12:36
2

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 ...
' {} \;
    
por 11.10.2012 / 02:35
0

Adicione espaço após ' e antes de -type

    
por 10.10.2012 / 12:32