Последовательная проверка значений - сценарий Bash

Как правило, Linux загружает индексный дескриптор в память только при открытии файла. Данные могут сохраняться в обновленной форме в памяти в течение некоторого времени после закрытия файла, прежде чем он будет сброшен на диск (с помощью логики кэширования )или помечен как неиспользуемый.

Нередко в файловых системах некоторые файлы часто открываются и закрываются. Можно повысить эффективность, не -читая inode повторно при последующих повторных открытиях.

Официальной ссылкой является исходный код ядра Linux. Каталог source/Documentation в дереве исходных текстов часто содержит детали, которые вы ищете, но может быть не полностью обновлен для соответствия исходному коду.

0
03.12.2019, 13:40
2 ответа

Похоже, вам придется убедиться, что выполнены два условия:

  1. Все числа из любых 7 последовательных значений должны быть 4 или больше.
  2. Два числа из любых 7 последовательных чисел должны быть не меньше 6.

Получается, что вам придется хранить массив чисел и проверять два условия с того момента, когда этот массив содержит ровно 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'
1
28.01.2020, 02:29

Версия 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"
    }' -
1
28.01.2020, 02:29

Теги

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