Предположим, Linux
Я изучал нечто подобное несколько лет назад. Вопрос, на который я не могу ответить, заключается в том, будет ли сеть по-прежнему доступна в нужное время.
Чтобы на самом деле отключить питание, вместо того, чтобы пытаться подключиться к SystemD или sysvinit, вы действительно должны попытаться подключиться к ядру напрямую с модом ядра.
Когда я искал эту тему, я в конце концов нашел некоторую информацию здесь:Как работает системное отключение ядра Linux внутри?
Это привело меня к коду ядра здесь :https://elixir.bootlin.com/linux/v5.0.5/source/arch/arm64/kernel/process.c#L136
void machine_power_off(void)
{
local_irq_disable();
smp_send_stop();
if (pm_power_off)
pm_power_off();
}
Чтобы сделать это правильно, вы должны написать модуль ядра, содержащий функцию, которая общается с выключателем питания по сети, а затем зарегистрировать вашу функцию в указателе функций pm_power_off
.
Выключение системы может еще больше зависеть от системы. Возможно, самым простым способом было бы вызвать существующую программу командной строки, такую как sutdown
или poweroff
.
Для этого не нужны регулярные выражения. Используйте оператор case
для сопоставления строки с шаблонами подстановочных знаков :. Они менее эффективны, чем регулярное выражение, но здесь их достаточно. См. Почему мое регулярное выражение работает в X, но не в Y? если вам нужно краткое описание того, чем шаблоны подстановочных знаков (подстановочные знаки )отличаются от синтаксиса регулярных выражений. Это работает в любой реализации sh (, даже до -POSIX Bourne ).
case $var in
'' | *[!0123456789]*) echo >&2 "This is not a non-negative integer."; exit 2;;
[!0]*) echo >&2 "This is a positive integer. I like it.";;
0*[!0]*) echo >&2 "This is a positive integer written with a leading zero. I don't like it."; exit 2;;
*) echo >&2 "This number is zero. I don't like it."; exit 2;;
esac
В любой системе Unix есть реализация sh. Любая не -устаревшая система Unix или POSIX имеет реализацию sh, которая (в основном )соответствует спецификации POSIX . Обычно это /bin/sh
, но есть несколько коммерческих уник, где /bin/sh
— старинная оболочка Борна, а современная POSIX sh — в /usr/posix/bin/sh
или что-то в этом роде.
Используйте #!/usr/bin/env sh
в качестве линии шебанга для практической портативности, если #!/bin/sh
вам не подходит.
[[ … ]]
недоступен в POSIX sh. Он доступен в ksh93, mksh, bash и zsh, но не в dash (популярном /bin/sh
в Linux )или BusyBox (популярном /bin/sh
во встроенном Linux ). Portable sh не имеет встроенного сопоставления регулярных выражений, только сопоставление с подстановочными знаками. Вы можете использовать grep, awk или sed, чтобы получить соответствие регулярным выражениям в системе POSIX.
=~
Ksh93, bash и zsh имеют оператор сопоставления регулярных выражений =~
в [[ … ]]
условных выражениях. У них немного другие правила цитирования.
В bash ≥3.1,символы регулярных выражений имеют особый эффект справа от оператора =~
, только если они не заключены в кавычки. Таким образом, [[ 100 =~ ^[1-9][0-9]*$ ]]
верно, но [[ 100 =~ '^[1-9][0-9]*$' ]]
ложно([[ $x =~ '^[1-9][0-9]*$' ]]
соответствует только строкам, в которых ^[1-9][0-9]*$
является подстрокой ).
В ksh 93u эффект заключения символа в кавычки в регулярном выражении зависит от символа :символы, которые также являются подстановочными знаками, не должны заключаться в кавычки, но символы, которые не являются символами, могут быть заключены в одинарные или двойные кавычки (но без обратной косой черты ). Таким образом, [[ 100 =~ ^[1-9][0-9]*$ ]]
верно, как и [[ 100 =~ '^'[1-9][0-9]*'$' ]]
, но [[ 100 =~ '^[1-9][0-9]*$' ]]
ложно (соответствует чему угодно с подстрокой [1-9][0-9]*
), а [[ 100 =~ ^[1-9][0-9]*\$ ]]
также ложно (соответствует любой строке, начинающейся с ненулевой цифры, затем еще цифры и$
).
В zsh любой символ регулярного выражения может быть заключен в кавычки или нет. Обратите внимание, что это означает, что для буквального включения символа вам нужны два уровня цитирования, например. \\*
или '\*'
для соответствия звездочке. Итак, и [[ 100 =~ ^[1-9][0-9]*$ ]]
, и [[ 100 =~ '^[1-9][0-9]*$' ]]
верны.
Я думаю, что помещение регулярного выражения в переменную — самый надежный способ не зависеть от особенностей оболочки.
regex='…' # Use extended regular expression syntax here, with '\'' if you need a literal apostrophe
if [[ $string =~ $regex ]]; …
То, какие диапазоны, такие как [0-9]
, совпадают, зависит от реализации и локали. В общем, вы не можете ожидать, что он будет совпадать только с 0123456789 (, хотя вы должны быть в состоянии предположить, что он совпадет с по крайней мере те ). Если важно, чтобы вы совпадали только с 0123456789, избегайте диапазонов и называйте символы по отдельности.