Читайте из файла, который имеет целочисленные значения в каждой отдельной строке, а затем, если условие выполняется выполнить оператор

Загрузчики, или Grub, если на то пошло, перестраивает карту памяти, как e820, я думаю, это причина, по которой вы видите разные значения между GRUB и загрузчиком заглушки EFI.

В исходном коде Linux есть комментарий, в котором говорится, что EFI допускает «более 128 записей, которые могут уместиться в устаревшей (нулевой странице) карте памяти e820». Судя по опубликованным вами числам, похоже, что это не так, поэтому я сомневаюсь, что добавление add_efi_memmap полезно ... Тем не менее, разобрать и эту таблицу тоже не повредит ...

-1
30.08.2018, 12:47
2 ответа

Вместо того, чтобы делать это в сценарии оболочки, я бы предложил сделать это с помощью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имеет допустимое значение, прежде чем делать какой-либо вывод, или вы получите поддельный вывод, если ваш ввод не содержит кратных пяти.

0
28.01.2020, 05:12

Если вы хотите вывести "шаг выполнен" во всех 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"
0
28.01.2020, 05:12

Теги

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