Как правило, Linux загружает индексный дескриптор в память только при открытии файла. Данные могут сохраняться в обновленной форме в памяти в течение некоторого времени после закрытия файла, прежде чем он будет сброшен на диск (с помощью логики кэширования )или помечен как неиспользуемый.
Нередко в файловых системах некоторые файлы часто открываются и закрываются. Можно повысить эффективность, не -читая inode повторно при последующих повторных открытиях.
Официальной ссылкой является исходный код ядра Linux. Каталог source/Documentation в дереве исходных текстов часто содержит детали, которые вы ищете, но может быть не полностью обновлен для соответствия исходному коду.
Похоже, вам придется убедиться, что выполнены два условия:
Получается, что вам придется хранить массив чисел и проверять два условия с того момента, когда этот массив содержит ровно 7 чисел.
После этого можно начинать замену чисел в массиве циклически, и для каждого нового числа снова проверять условия.
Следующий скрипт bash
делает именно это. Поскольку этот кажется вопросом домашнего задания, я не буду говорить об этом больше, чем то, что сказано в комментариях к коду. Учтите, что, используя это как ответ на домашнее задание, не зная, что делает код, вы окажете себе медвежью услугу.Вы также можете быть привлечены к ответственности за мошенничество, если качество кода отличается от того, что было замечено вами или вашими коллегами.
#!/bin/bash
has_studied () {
# Tests the integers (given as arguments) and returns true if
# 1. All numbers are 4 or larger, and
# 2. There are at least two numbers that are 6 or greater
local enough large
enough=0 large=0
for number do
[ "$number" -ge 4 ] && enough=$(( enough + 1 ))
[ "$number" -ge 6 ] && large=$(( large + 1 ))
done
# Just some debug output:
printf 'Number of sufficient study days: %d\n' "$enough" >&2
printf 'Number of long study days (out of those): %d\n' "$large" >&2
[ "$enough" -eq 7 ] && [ "$large" -ge 2 ]
}
# Array holding the read integers
ints=()
echo 'Please enter hours of study, one integer per line' >&2
echo 'End by pressing Ctrl+D' >&2
# Loop over standard input, expecting to read an integer at as time.
# No input validation is done to check whether we are actually reading
# integers.
while read integer; do
# Add the integer to the array in a cyclic manner.
ints[i%7]=$integer
i=$(( i + 1 ))
# If the array now holds 7 integers, call our function.
# If the function returns true, continue, otherwise terminate
# with an error.
if [ "${#ints[@]}" -eq 7 ]; then
if ! has_studied "${ints[@]}"; then
echo 'Has not studied!'
exit 1
fi
fi
done
# If the script hasn't terminated inside the loop, then all input has
# been read and the student appears to have studied enough.
echo 'Appears to have studied'
Версия awk
, читаемая из stdin
awk 'BEGIN{print "Enter study hours and finish input with ctrl+d:"}
{if ($0 >=0) {count++; print $0" hours on day "count}
if ($0 >= 4 && $0 < 6) hrs[4]++;
if ($0 >= 6) hrs[6]++}
END{print "\nStudy scheme over "count" days:";
for (d in hrs) print d" hours studied on "hrs[d]" days";
if (hrs[4]+hrs[6] < 7 || hrs[6] < 2) not=" not";
print "You are"not" studying regularly"
}' -