Сравнение целых чисел Bash

Как сказал @Gilles, BST — это то, что выводится на date/ date +%Z, чтобы сообщить пользователям, что это дата по британскому летнему времени (, поэтому GMT+1 )не определяет часовой пояс., а не то, что вы можете использовать для $TZ.

Этот BST важен для британских пользователей. Когда британский пользователь видит 14:00 BST, он знает, что отметка времени относится к 14 :00 по летнему времени в континентальной Великобритании (, то есть к 13 :00 UTC ). Использование этих 3 -4 буквенных кодов широко распространено в Великобритании, США и некоторых других англоязычных странах, поэтому в выводе по умолчанию отображается dateтам (в en_GB.UTF-8локалях, например ). С другой стороны, большинство французских пользователей понятия не имеют, что 14:00 CESTозначает (, хотя CESTотносится к центральноевропейскому летнему времени , GMT+2, которое применяется летом во Франции ). ],поэтому вы заметите, что когда даты указывают часовой пояс, они скорее включают смещение UTC, чем CET/ CESTтам (напримерmardi 2 mai 2017, 13:34:09 (UTC+0200)).

Переменная $TZне должна содержать эти 3 -4-буквенных кода. Он содержит то, что определяет / определяет часовой пояс, регион, в котором вы находитесь. Приложения используют его, чтобы узнать смещение относительно UTC в любой момент времени, когда переключаться между Зимним и Летнее время и какой код (если есть )для Зимнего и Летнего времени будет отображаться пользователю (для тех пользователей, для которых это значимо ).

Для этого вы можете установить TZна некоторую системную -спецификацию часового пояса. Подобно TZ=:Europe/London(, хотя многие системы также принимают TZ=Europe/London, а также )или содержат TZполные правила (, хотя эти правила ограничены ).

Например, если я использую TZ=:Europe/Londonв своей системе, то правила будут считываться из /usr/share/zoneinfo/Europe/London.

В этом файле будет указано, например, что с 1996 года смещение от UTC равно 0 от последнего воскресенья октября в 2 часа ночи UTC до последнего воскресенья марта (с именем GMT для «Среднего времени по Гринвичу» )и 1 по другому мудрому (с именем BST для «британского летнего времени» ), в то время как для 1970 (0 времени Unix )по 1972 год было 1 круглый год с именем BST для «британского стандарта». Время".

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

Теперь вы также можете включить TZв полные правила. Например, для «британского стандарта (, а не летнего )времени» начала 70-х годов,можно использовать простейшую форму спецификации:

TZ=BST-1

Указывает часовой пояс, который всегда находится на 1 час восточнее UTC и для которого date +%Zвсегда возвращает BST. Этот часовой пояс является правильным для континентальной Британии в начале 70-х годов и для летнего времени с 1972 года, но не для зимнего времени с 1972 года (, и мы не можем сказать на будущее ).

Или вы можете использовать полную спецификацию текущих правил:

TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00

Это говорит о том, что в году есть два периода, один из которых называется GMT со смещением 0, а другой BST со смещением 1 (подразумевается как 0+1 выше, если не указано иное ), где переключатель от одного до другого в последнее (5 )воскресенье (0 )марта (3 )в 1 :00 :00 UTC и обратно в последнее воскресенье октября в 2 :00.

Опять же, что TZ работает с 1996 года по настоящее время, но не обязательно иначе. Например, для 1970 -01 -01 00 :00 :00 UTC (0 время эпохи Unix, когда местное время было 1 :00 :00 BST (Британский Стандартное время )в Лондоне):

$ TZ=:Europe/London date -d @0
Thu  1 Jan 01:00:00 BST 1970
$ TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00 date -d @0
Thu  1 Jan 00:00:00 GMT 1970

Согласно POSIX , поведение для

  • TZ=BST-1хорошо определен (как описано выше)
  • TZ=BST(или TZ=GMT/ TZ=UTC/TZ=Europe/London)не указано.
  • TZ=:BST/ TZ=:Europe/London— это реализация, определенная . То есть системы предназначены для его поддержки и документирования того, что он делает, хотя POSIX не говорит нам, что это делается.

В третьем случае выше, в системах GNU (и, я думаю, в большинстве других Unix -подобных системах ), когда TZначинается с :, то, что следует за этим, принимается как путь к файл определения часового пояса. В случае системы GNU это также имеет место, когда :опущено (, даже если значение формирует допустимую спецификацию часового пояса, например UTC0, но обычно таких файлов не должно существовать,хотя я вижу некоторые исключения в моей системе, которые делают ее не -системой POSIX (, например, TZ=CST6CDT date -d 1943-01-01 +%Zвыводит CWTвместо CST, потому что есть /usr/share/zoneinfo/CST6CDTфайл 1 который определяет военное время для этого периода )).

Этот путь, как правило, является относительным путем, и в этом случае он относится к$TZDIR(или некоторому значению по умолчанию, например /usr/share/zoneinfo, когда $TZDIRне установлено, как это обычно бывает ). По соображениям безопасности $TZDIR, абсолютный путь или относительные пути с компонентами ..игнорируются в контекстах повышения привилегий (, как и в контекстах setuid ).

Обычно в системе GNU TZ=:BST, как и TZ=BST, обычно ищет файл /usr/share/zoneinfo/BST. Если не найдено (, как это было бы в случае, поскольку BSTне может идентифицировать определение часового пояса ), обычно предполагается время UTC и имя часового пояса (, как в date +%Zвывод )из BST.


1 Такие CST6CDT, как WET, CET, MET... являются пережитками из другого времени. В конце 1993 года база данных TZ (, как и сейчас , поддерживаемая IANA ), изменилась с использования специальных (и чаще всего двусмысленных )имен (, таких как MET, GB-Eire, отWET)до Area/Cityгде город является самым густонаселенным городом (на момент выпуска )где применяется зона (Площадь представляет собой большие области, такие как континент/океан ). Для континентальной Британии, где раньше использовался GB-Eire(, а не WET ), теперь (с 1993 г. )используется Europe/London. GB-Eire(, как и WET), все еще доступны для обратной совместимости(GB-Eireтеперь ссылаются на Europe/London, в то время как WETопределяется как зона, использующая UTC зимой, и правила ЕС для перехода на летнее время (Великобритания только следует правила ЕС с 1996 года, и теперь, когда Великобритания покидает ЕС, никто не может сказать, что ждет нас в будущем )), но не следует использовать сейчас в новых развертываниях.

1
22.12.2017, 18:51
1 ответ

Не то, чтобы я мог видеть.

Но между [[ val1 < val2 ]]и(( val1 < val2 )):есть разница: первое — это сравнение строк.

$ [[ 2 -lt 007 ]] && echo true || echo false
true
$ [[ 2 < 007 ]] && echo true || echo false
false
$ (( 2 < 007 )) && echo true || echo false
true

Хотя ведущие нули по-прежнему представляют проблему в обоих случаях:

$ (( 20 < 021 )) && echo true || echo false
false
$ [[ 20 -lt 021 ]] && echo true || echo false
false

Это потому, что они отмечают восьмеричные числа, как в C. Но вы предотвращаете это, добавляя к ним префикс 10#.(Справочник по Bash 6.5 Арифметика оболочки)

$ (( 10#20 < 10#021 )) && echo true || echo false
true
4
27.01.2020, 23:32

Теги

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