Я пытаюсь запустить сценарий оболочки, который подсчитывает количество строк в каждом файле, и если число <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) '
Что не так со сценарием оболочки?
Есть много проблем:
foreach
не является ключевым словом bash: используйте для
$ (...)
, а не только круглые скобки для i в *.DAT; выполните
(в общем см. Почему * не * разобрать `ls`? ) man test
): если [$ a -le 2]; тогда
для
заканчивается done
, а не end
, если
заканчивается 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
Как сказал Маттео, вы пытаетесь использовать синтаксис perl. Должно быть;
for i in $(ls *.DAT); do
if [ $(wc -l ${i}) -le 2 ]; then
mv ${i} /path/to/
fi
done