Meu primeiro Shell que conta as linhas em cada arquivo

0

Estou tentando executar um script de shell que conta o número de linhas em cada arquivo, e se o número < 2 Eu preciso movê-lo para um diretório diferente.

shell:

#!/bin/bash


foreach i in (ls *.DAT)
  a='wc -l $i'
  if $a=<2 then
    mv $i aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup      
  endif
end

Mas meu shell recebe um erro:

igud_to_backup.sh: line 8: syntax error near unexpected token '('

igud_to_backup.sh: line 8: 'foreach i in (ls *.DAT)'

O que há de errado com o script de shell?

    
por Elislu 28.06.2016 / 12:31

2 respostas

2

Existem muitos problemas:

  • foreach não é uma palavra-chave bash: use for
  • se você quiser executar um comando, use $( ... ) e não apenas os parênteses
  • a execução do comando no parêntese não é necessária, você pode simplesmente usar a expansão do shell for i in *.DAT; do (em geral, consulte Por que * não * analisar 'ls'? )
  • para testar se um valor é menor ou igual (consulte man test ): if [ $a -le 2 ] ; then
  • um for é finalizado por done e não end
  • um if é finalizado por fi e não endif
  • se você der o nome do arquivo como um argumento para wc , ele imprimirá o número de linhas e o nome do arquivo. Use < para fazer wc ler a partir da entrada padrão

Para resumir:

#!/bin/sh
for i in *DAT; do
  a=$( wc -l < "$i" )
  if [ "$a" -le 2 ] ; then
    mv "$i" aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup
  fi
done
    
por 28.06.2016 / 12:51
0

Como Matteo mencionou, você está tentando usar a sintaxe perl. Deveria estar;

for i in $(ls *.DAT); do
  if [ $(wc -l ${i}) -le 2 ]; then
    mv ${i} /path/to/
  fi
done
    
por 28.06.2016 / 13:36