Моя первая оболочка, которая подсчитывает строки в каждом файле

Я пытаюсь запустить сценарий оболочки, который подсчитывает количество строк в каждом файле, и если число <2 мне нужно переместить его в другой каталог.

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

Но моя оболочка выдает ошибку:

igud_to_backup.sh: строка 8: синтаксическая ошибка рядом с неожиданным токеном `('

igud_to_backup.sh: строка 8:` foreach i in (ls * .DAT) '

Что не так со сценарием оболочки?

0
28.06.2016, 13:46
2 ответа

Есть много проблем:

  • foreach не является ключевым словом bash: используйте для
  • , если вы хотите выполнить используйте команду $ (...) , а не только круглые скобки
  • выполнение команды в круглых скобках не требуется, вы можете просто использовать расширение оболочки для i в *.DAT; выполните (в общем см. Почему * не * разобрать `ls`? )
  • , чтобы проверить, меньше ли значение или равно (см. man test ): если [$ a -le 2]; тогда
  • a для заканчивается done , а не end
  • an , если заканчивается fi и not endif
  • , если вы укажете имя файла в качестве аргумента для wc , он напечатает количество строк и имя файла. Используйте <, чтобы wc считывались со стандартного ввода

Подводя итог:

#!/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
2
28.01.2020, 02:34

Как сказал Маттео, вы пытаетесь использовать синтаксис perl. Должно быть;

for i in $(ls *.DAT); do
  if [ $(wc -l ${i}) -le 2 ]; then
    mv ${i} /path/to/
  fi
done
0
28.01.2020, 02:34

Теги

Похожие вопросы