Загрузчики, или Grub, если на то пошло, перестраивает карту памяти, как e820, я думаю, это причина, по которой вы видите разные значения между GRUB и загрузчиком заглушки EFI.
В исходном коде Linux есть комментарий, в котором говорится, что EFI допускает «более 128 записей, которые могут уместиться в устаревшей (нулевой странице) карте памяти e820». Судя по опубликованным вами числам, похоже, что это не так, поэтому я сомневаюсь, что добавление add_efi_memmap полезно ... Тем не менее, разобрать и эту таблицу тоже не повредит ...
Вместо того, чтобы делать это в сценарии оболочки, я бы предложил сделать это с помощьюawk
:
awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }' <a.txt
Это делает код коротким, быстрым и простым. Код awk
сохраняет каждое число, кратное 5, которое он находит во входных данных, и в конце выводит самое последнее найденное такое число.
Тестирование (в оболочке с фигурными скобками):
$ printf '%s\n' {1..47} | awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }'
Step 45 completed
Эквивалентный цикл оболочки будет выглядеть так
while read number; do
if [ "$(( number % 5 ))" -eq 0 ]; then
last_step=$number
fi
done <a.txt
printf 'Step %s completed\n' "$last_step"
Вы можете вставить тест, чтобы убедиться, что last_step
имеет допустимое значение, прежде чем делать какой-либо вывод, или вы получите поддельный вывод, если ваш ввод не содержит кратных пяти.
Если вы хотите вывести "шаг выполнен" во всех 5 строках, тогда оставшаяся часть номера шага делится на 5 и сравнивается с 0:
#!/bin/bash
while IFS= read -r line;
do
if [[ $(( line %5 )) -eq 0 ]] ; then
echo "Step Completed is: $line"
fi
done < "$1"
(не также то, что в вашем скрипте ваша переменная называется line
или var
....)
Если вам нужна только последняя такая строка,то вам нужно дождаться конца, чтобы распечатать его. Если у вас есть полная последовательность чисел, вы можете вычислить ее в конце:
#!/bin/bash
while IFS= read -r line;
do
# do whatever for the line
echo $line >/dev/null
done < "$1"
echo "Step completed is: $(( 5 * ( line % 5 ) ))"
В противном случае просто запомните последнее, что вы видели:
#!/bin/bash
while IFS= read -r line;
do
[[ $(( line %5 )) -eq 0 ]] && line5=$line
# do whatever for the line
done < "$1"
[[ ! -z "$line5" ]] && echo "Step completed is: $line5"