Я следую серии руководств, чтобы изучить сценарий оболочки Bash. Одно из упражнений состоит в том, чтобы пройтись по файлам в текущем каталоге и найти шаблон в этих файлах. Если шаблон найден, сценарий должен суммировать размер этих файлов.
#!/bin/sh
patern=echo
totalSize=0
for file in *
do
[ ! -f $file ] && continue
if grep $patern $file > /dev/null
then
echo "pattern matched in $file"
echo "file size is `stat -c%s $file`"
fileSize=`stat -c%s $file`
totalSize=`expr $totalSize + $fileSize`
echo "size so far is $totalSize bytes"
echo
fi
done
У меня есть еще одна папка в каталоге, из которого я запускаю скрипт. Папка называется "somedir". Он пуст. Я взял фрагмент выходного текста, вставленный ниже. Средние 3 строки показывают, когда цикл перебирает каталог «somedir», который печатается как «sum_files» — имя моего сценария вместе с размером файла.
Я не понимаю такого поведения. Как пустой каталог может иметь размер файла?
Но меня больше всего беспокоит, почему ключевое слово continue не останавливает итерацию цикла. Вывод показывает, что скрипт выполняет приведенный ниже оператор if, содержащий команду grep, даже если он должен остановиться, если каталог найден.
Я убедился, что тестовая команда[ ! -f $file ]
на самом деле возвращает 0, когда цикл достигает каталога, и поэтому должна быть вызвана команда && continue
. Так почему же программа продолжает остальную часть кода цикла и пытается выполнить поиск каталога, а не просто пропустить итерацию цикла при продолжении, как и ожидалось? Я знаю, что это довольно тривиально, но хотел бы знать, что здесь происходит.
Выходной текст
шаблон, сопоставленный при выходе на пенсию
размер файла 396
размер на данный момент 6385 байт
шаблон соответствует в sum_files
размер файла 398
размер на данный момент 6783 байт
шаблон соответствует tp0
размер файла 164
размер на данный момент 6947 байт
set -x
посмотреть, что произойдет. - person gniourf_gniourf   schedule 20.09.2015set -x
сразу после#!/bin/sh
. - person gniourf_gniourf   schedule 20.09.2015:)
. - person gniourf_gniourf   schedule 20.09.2015