Что Лучший способ состоит в том, чтобы Выполнить Сравнение Метки времени в Bash

p["HM"] не является довольно регулярным адресуемым значением : хэш-карты могут расти во время выполнения , а затем их значения перемещаются в памяти, а старые местоположения становятся устарели. Если значения в картах рассматривались как обычные адресуемые значения, эти внутренние функции реализации map были бы открыты.

Итак, p["HM"] - это немного другая вещь, называемая выражением индекса в спецификации; если вы будете искать спецификацию для фразы «выражение индекса», вы увидите, что вы можете делать с ними определенные вещи, например, читать их, назначать им и использовать их в выражениях increment / decment (для числовых типов). Но вы не можете все. Они, возможно, предпочли реализовать специальные случаи more , чем они, но я предполагаю, что они не просто упростили ситуацию.

Ваш подход кажется хорошим здесь - вы измените его на обычное назначение, одну из специально разрешенных операций. Другой подход (возможно, хорош для больших структур, которые вы хотите избежать копирования?) - это сделать значение карты регулярным старым указателем , что вы можете изменить базовый объект с помощью:

package main

import "fmt"
type Person struct {
     name string
     age int
 }

type People map[string]*Person

func main() {
  p := make(People)
  p["HM"] = &Person{"Hank McNamara", 39}
  p["HM"].age += 1
  fmt.Printf("age: %d\n", p["HM"].age)
}

38
задан Lance Roberts 16 October 2008 в 04:36
поделиться

3 ответа

Безусловно самое легкое должно сохранить метки времени как время изменения фиктивных файлов. GNU touch и date команды может установить/получить эти времена и выполнить вычисления даты. Bash имеет тесты, чтобы проверить, является ли файл более новым, чем (-nt) или более старым, чем (-ot) другой.

, Например, чтобы только отправить уведомление, если последнее уведомление было больше чем час назад:

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi
63
ответ дан Bruno De Fraine 23 September 2019 в 19:00
поделиться

Используйте команду даты, чтобы преобразовать эти два раза в стандартный формат и вычесть их. Вы, вероятно, захотите сохранить предыдущее время выполнения в dotfile, тогда делают что-то как:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(Спасибо, Steve.)

14
ответ дан Veger 23 September 2019 в 19:00
поделиться

Использование "тест":

if test file1 -nt file2; then
   # file1 is newer than file2
fi

РЕДАКТИРОВАНИЕ: Если Вы хотите знать, когда событие имело место, можно использовать "касание" для создания файла, который можно позже сравнить использование "тест".

19
ответ дан JesperE 23 September 2019 в 19:00
поделиться
Другие вопросы по тегам:

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