“Fim inesperado do arquivo” Retornado do BASH Script

0

Não sei por que estou recebendo isso. Eu percebo que essa deve ser uma pergunta comum, mas não consigo descobrir.

#!/bin/bash
 #Checks word count of each text file directory and deletes if less than certain   amount of words
 #Lastly, displays number of files delter

 count = 0 #Set counter to 0
 limit = 2000

 for file in *.txt
 do
     words = wc -w > $file
     if words < $limit
         rm $file
         count = $count + 1
     end
 end

 print "Number of files deleted: $count" 
    
por hipHopMetropolisHastings 27.10.2015 / 17:12

3 respostas

5

Receio que o seu script esteja cheio de erros de sintaxe. O erro específico que você está vendo é porque você não está fechando o loop for corretamente, mas há muitos, muitos mais:

  1. Você não pode ter espaços em torno de = ao atribuir valores a variáveis (exceto em expressões aritméticas);
  2. Para salvar a saída de um comando em uma variável, você deve usar substituição de comando , seja var='command' ou var=$(command) ;
  3. Ao se referir ao valor de uma variável, você deve usar $var , não var e geralmente, que precisa ser citado ( "$var" );
  4. Ao fazer uma comparação aritmética , você precisa usar o -lt de o comando [ , não < , a menos que você esteja usando parênteses duplos;
  5. O formato command > file sobrescreverá file com a saída do comando. Você provavelmente quis usar wc < "$file" e não wc > $file ;
  6. Você não pode adicionar um valor a uma variável usando var=$var+1 , a menos que essa variável tenha sido anteriormente declarada como um inteiro, você precisa de ((var=var+1)) , var=$((var+1)) ou declare -i var; var=var+1 . Para adicionar 1, você também pode usar ((var++)) ;
  7. Sua sintaxe if está errada. O formato correto é if condition; then do something; fi
  8. O mesmo vale para o loop for , a sintaxe correta é for loop-specification; do something; done ;
  9. Não há comando print (não criado no bash), apenas printf e echo ;
  10. Você deve sempre citar suas variáveis a menos que haja uma boa razão para não fazê-lo.

Então, uma versão funcional do seu script com pequenas melhorias seria:

#!/bin/bash -
# Checks word count of each text file directory and deletes if less than certain   amount of words
# Lastly, displays number of files deleted

count=0 # Set counter to 0
limit=2000

for file in *.txt
do
     words=$(wc -w < "$file")
     if [ "$words" -lt "$limit" ]
     then
         rm -- "$file"
         ((count++))
     fi
done

echo "Number of files deleted: $count" 

Da próxima vez, recomendo que você se familiarize com um idioma antes de tentar codificar nele. Cada idioma tem suas próprias regras e sintaxe.

    
por 27.10.2015 / 17:44
0

Seus terminadores de loop estão incorretos. Um for loop é finalizado por done , não end . Da mesma forma, a condição if é finalizada por fi , não por end .

Esta é a sintaxe shell da família Bourne / POSIX. Outras shells podem de fato ter essas duas coisas terminadas por end , mas bash não.

    
por 27.10.2015 / 17:17
0
words = wc -w > $file

o > char aqui parece fora do lugar. Sem isso você estaria contando as linhas de $file , mas como está, você está contando a linha de stdin e produzindo o resultado em $file .

    
por 27.10.2015 / 17:25

Tags