Как изменить время и сравнить его в сценарии оболочки

Нет, bash не кэширует вывод команд, так как вывод может меняться от запуска к запуску; bash не имеет надежного -огневого способа отследить, был ли файл изменен другим процессом, что было бы критически важно, чтобы bashможно было определить, действителен ли его кешированный результат или нет.

Однако тут дело в другом. Когда вы используете оболочку (, такую ​​как bash), вы одновременно взаимодействуете с несколькими частями системы. Например:

  • Сама оболочка
  • GNU Readline, который является строковым -интерфейсом редактирования, используемым несколькими оболочками и другими инструментами
  • Реализация libc, которая время от времени может вызывать запутанное поведение практически в любой программе.
  • Сам терминал, который может вести себя странно,и может отвечать на собственные команды . (. любой из Рюкзак и Удалить могут быть недоступны, или они могут быть заменены местами)
  • Окно GUI, внутри которого находится терминал (, если применимо ). Например. он может иметь IME , который позволяет вводить символы Unicode в терминал с помощью специальной последовательности клавиш (, такой как Ctrl + Shift + u , за которым следует номер.)
  • Ядро, включая все его модули и драйверы
  • Само оборудование, которое, естественно, может перегреваться, замыкаться -, терять питание и т.д.

В этом случае, я бы сказал, что самый большой вклад вносит не bashсам по себе, а механизм кэширования на уровне файловой системы -, реализованный в ядре. После того как вы прочитали файл один раз, большая его часть может оказаться в кеше файловой системы, который представляет собой кусок памяти, зарезервированный для этой цели.

При повторном выполнении операций над файлом оболочка не запускает повторно чтение физического оборудования, а извлекает содержимое файла из кэша. Почти любая операция, которую вы (и )выполняете в bash, будет чрезвычайно быстрой по сравнению с чтением с диска. Вот почему вы не замечаете, что bash на самом деле повторно -выполняет команды, потому что отсутствует медленное чтение с диска.

0
24.10.2019, 18:14
2 ответа

Не знаю, как вы собираетесь использовать (и )с операторами bash , однако это сработает:

if [ 0142 -ge 0045 ] && [ 0142 -lt 0130 ]; then
    echo "yep"
fi

Если это не то, что вам нужно, вставьте как можно больше релевантного кода.

редактировать:

Как указано в комментариях ниже, это действительно вызовет проблемы, поскольку сравнивает восьмеричные числа с (в конце концов после 10:00 )десятичными числами

Я бы рекомендовал использовать dateдля преобразования времени в секунды, а затем сравнить это.

Примером может быть:

# grab these however you are currently
time1="01:42"
time2="00:45"
time3="01:42"
time4="01:30"

time1Second=$(date -d "${time1}" +%s)
time2Second=$(date -d "${time2}" +%s)
time3Second=$(date -d "${time3}" +%s)
time4Second=$(date -d "${time4}" +%s)

# then your comparison operators and logic:
if [ "$time1Second" -ge "$time2Second" ] && [ "$time3Second" -lt "$time4second" ]; then
    # logic here
    echo true
fi

Таким образом, вы всегда сравниваете числа по одному и тому же основанию

1
28.01.2020, 02:39

Преобразуйте время в минуты и сравните их

startTime=00:45
fileTime=01:42

hr=${startTime/:*} mn=${startTime/*:}      # Split hh:mm into hours and minutes
startMins=$(( ${hr#0} * 60 + ${mn#0} ))    # Minutes since midnight

hr=${fileTime/:*} mn=${fileTime/*:}
fileMins=$(( ${hr#0} * 60 + ${mn#0} ))

if [[ $fileMins -ge $startMins ]]; then :...; fi
0
28.01.2020, 02:39

Теги

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